Spring 笔记
Posted 好奇害死猫+1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 笔记相关的知识,希望对你有一定的参考价值。
1, 新建包或导入工程错误提示:
The type javax.servlet.ServletContext cannot be resolved. It is indirectly referenced from required .class files。
解决方法:在安装的tomcat下的lib目录里面找到servlet-api.jar包,导入项目下的lib文件夹中即可。
2,Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config. T
Eclipse新建Server时,会在 当前workspace目录下新建 /Servers/Tomacat v7.0 Server at localhost-config目录,
然后将/opt/ apache-tomacat-7.0.59/conf 目录下的所有文件拷贝到这里。Eclipse没有访问它的权限,所以无法拷贝,那么Server自然创建失败。
解决方法:删了重建
3,@RequestParam传参解决中文乱码
1)post方法
@RequestMapping(value="login.do", produces="text/html;charset=utf-8")
-->login.do 表单提交地址
2)get方式
String user=new String(username.getBytes("iso-8859-1"),"utf-8");
String pwd=new String(password.getBytes("iso-8859-1"),"utf-8");
-->注意,如果进来的是中文未乱码,此方法转换返回 ????
4,服务器启动
Result Maps collection already contains value forxxx”的解决方案
-->Eclipse编译了一份在bin目录下,将bin目录或者WEB-INF下class目录清空即可
5,注入null和空字符串值
<bean id="student" class="com.spring.entity.Student">
<property name="stuName"> <null /> </property>
</bean>
<bean id="student" class="com.spring.entity.Student">
<property name="stuName"> <value></value> </property>
</bean>
6,Bean的作用域
<bean id="student" class="com.spring.entity.Student" scope="singleton"/>
singleton : 默认值,Spring以单例模式创建bean的实例,即容器中该bean的实例只有一个
prototype : 每次从容器中获取bean时,都会创建一个新的实例
request : 用于web应用环境,针对每次http请求都会创建一个实例
session : 用于web应用环境,同一个会话共享用一个实例,不同的会话使用不同的实例
global session : 仅在Portlet的web应用中使用,同一个全局会话共享一个实例;对于非Portlet环境,等同于session
===>使用 request,session,global session 需要在 web.xml 中配置一个请求监听器
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
7,注解
@Component("xxxx") : 标注一个普通的Spring Bean类
@Repository("xxxx") : 用于标注DAO类
@Service("xxxx") : 用于标注业务类
@Controller("xxxx") : 用于标注控制器类
添加命名空间:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
<!-- 扫描包中注解标注的类 -->
<context:component-scan base-package=" 包名 "></context:component-scan>
@Scope() : 指定bean的作用域
@Autowired : 自动装配
8,AOP aspect oriented programming
增强 advice
切入点 pointcut
连接点 joinpoint
切面 aspect
代理 proxy
目标对象 target
织入 weaving
示例:
<!-- 声明切面类 -->
<bean id="testLogger" class="com.spring.logger.TestLogger" />
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.*.*(..))"
id="pointcut"/>
<aop:aspect ref="testLogger">
<aop:before method="beforeLogger" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
execution : 切入点指示符,括号中是切入点表达式
public * addUser(com.entity.User) : "*" 表示匹配所有类型的返回值 , 方法名( 参数 )
public void *(com.entity.User) : "*" 表示匹配所有方法名
public void addUser(..) : ".." 表示匹配所有参数个数和类型
* com.service.*.*(..) : 表示匹配 com.service 包下所有类的所有方法
* com.service..*(..): 表示匹配 com.service 包及其子包下所有类的所有方法
9,增强处理类型
Before : 前置增强处理,在目标方法前织入增强处理
AfterReturning : 后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理
AfterThrowing : 异常增强处理,在目标方法抛出异常后织入增强处理
After : 最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理
Around : 环绕增强处理,在目标方法的前后都可以织入增强处理
示例:
public void afterReturningLogger(JoinPoint jp, Object result){
执行方法的名称-->jp.getSignature().getName()
方法的参数-->jp.getArgs()[0]
方法返回的值:"+result
===><aop:after-returning method="afterReturningLogger"
pointcut-ref="pointcut" returning="result"/>
获取方法返回值需加 returning 属性
>环绕增强 : 第一个参数必须是 ProceedingJoinPoint ,并且使用 pjp.proceed() 调用目标方法
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("aop:around 方法");
System.out.println("aop:around 目标方法前执行----------------->");
pjp.proceed();
System.out.println("aop:around 目标方法后执行----------------->");
}
---><aop:around method="around" pointcut-ref="pointcut"/>
10,设值注入 和 构造注入
设值注入 : 通过setter访问器实现,灵活性好,时效性差
构造注入 : 通过构造方法实现,灵活性差,时效性好
设值输入示例:
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
<bean id="studentDaoImpl" class="com.spring.dao.impl.StudentDaoImpl" />
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<ref bean="studentDaoImpl"/>
</property>
</bean>
构造方法注入:
public GradeServiceImpl(GradeDao gradeDao) {
this.gradeDao = gradeDao;
}
<bean id="gradeDao" class="com.spring.dao.impl.GradeDaoImpl"></bean>
<bean id="gradeServiceImpl" class="com.spring.service.impl.GradeServiceImpl">
<!-- 使用构造方法为 gradeService 的 gradeDao 属性赋值-->
<constructor-arg>
<ref bean="gradeDao"/>
</constructor-arg>
</bean>
调用实例工厂方法创建Bean
factory-bean: 该属性的值为工厂Bean的id。
factory-method: 该属性指定实例工厂的工厂方法。
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="grade" class="com.spring.entity.Grade">
<property name="date">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2017-06-06" />
</bean>
</property>
</bean>
11,使用 p 命名空间注入bean的属性
property 注入:
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<ref bean="studentDaoImpl"/>
</property>
</bean>
p命名: 添加 xmlns:p="http://www.springframework.org/schema/p"
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl"
p:studentDao-ref="studentDaoImpl" />
注意:
对于直接量(基本数据类型,字符串)属性,使用方式如下:
p:属性名 = "属性值"
对于引用Bean的属性,使用方法如下:
p:属性名-ref = "bean的ID"
12,使用内部bean
如果一个bean组件仅在一处使用,可以把它定义为内部bean
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<bean class="com.spring.dao.impl.StudentDaoImpl"/> <--------
</property>
</bean>
13, bean 和 local 的区别
<property name="studentDao">
<ref bean="studentDaoImpl"/> 或 <ref local="studentDaoImpl"/>
</property>
local属性只能在同一个配置文件中检索bean的ID,而使用bean属性可以在其他配置文件中检索ID
14,注入集合类型
<property name="hobbies">
<list>
<value>xxxx</value> 或 <ref bean=""/>
<value>xxxx</value>
</list>
</property>
<property name="hobbies">
<set>
<value>xxxx</value> 或 <ref bean=""/>
<value>xxxx</value>
</set>
</property>
<property name="hobbies">
<map>
<entry>
<key> <value>xxxx</value> </key>
<value>xxxx</value>
</entry>
<entry>
<key> <value>xxxx</value> </key>
<value>xxxx</value>
</entry>
</map>
</property>
====> <entry key="xx" value="xxxx" /> 简写形式
Properties类型:
<property name="hobbies">
<props>
<prop key="xxx">xxx</prop>
<prop key="xxx">xxx</prop>
</props>
</property>
15,使用接口实现增强方法
implements AfterReturningAdvice
implements MethodBeforeAdvice
implements MethodInterceptor
示例:
public class ServiceAdvice implements MethodBeforeAdvice{}
<bean id="serviceBeforeAdvice" class="com.spring.logger.ServiceAdvice"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.GradeServiceImpl.*(..))"
id="gradeservice_cut"/>
<aop:advisor advice-ref="serviceBeforeAdvice" pointcut-ref="gradeservice_cut"/>
</aop:config>
使用POJO普通类实现增强方法 (推荐)
public class TestLogger {}
<bean id="testLogger" class="com.spring.logger.TestLogger" />
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.StudentServiceImpl.*(..))"
id="pointcut"/>
<aop:aspect ref="testLogger">
<aop:around method="around" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
15,ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
两种方法:
a. ClasspathResource res = new ClasspathResource(“a.xml,b.xml,……”);
多个资源文件路径之间可以是用” ,; /t/n”等分隔。
b. ClasspathResource res = new ClasspathResource(newString[]{“a.xml”,”b.xml”,……});
16,bean组件, 通过无参构造方法实例化对象,setter方法设值
以上是关于Spring 笔记的主要内容,如果未能解决你的问题,请参考以下文章
Spring In Action 4 学习笔记Spring概览