Spring 总结
配置文件
Ø Sping 依赖库
l SPRING_HOME/dist/spring.jar
l SPRING_HOME/lib/Jakarta-commons/commons-logging.jar
l SPRING-HOME/lib/log4j/log4j.jar
l SPRING-HOME/lib/aspectj.jar
Ø 拷贝spring配置文件到src下
Ø 拷贝log4j配置文件到src下
Ø 在UserManager中提供构造函数或setter方法,spring 将实例化好的UserDao实现注入给我们
Ø 让spring管理我们的对象创建和依赖,必须在spring文件中进行定义。
Ø 编写客户端:spring IOC容器的关键点:
l 必须将被管理的对象定义到spring 配置文件中
l 必须定义构造函数或setter方法,让spring将对象注入过来
属性编辑器及一些用法
Ø 作用:自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入spring已经有内置的属性编辑器,我们可以根据自己的需求自己定义属性编辑器。
Ø 定义:继承PropertyEditorSupport类,覆写setAsText()方法。将属性编辑器注册到spring中。
<!-- 定义属性编辑器 -->
<bean id="customEditorConfig" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date"> <bean class="com.xasxt.editor.DatePropertyEditor">
<property name="pattern" value="yyyy-MM-dd"></property>
</bean>
</entry>
<entry key="com.xasxt.Address">
<bean class="com.xasxt.editor.AddressProperty"></bean>
</entry>
</map>
</property>
</bean>
Ø 依赖属性的注入
l Ref属性
l <ref/>标签
l 内部<bean>来定义
Ø 如何将公共的属性描述出来?
l 通过<bean>标签定义公共的属性,指定abstract=true
l 具有相同的属性的类在<bean>标签中指定其parent
l <bean id="prop" abstract="true">
l <property name="name" value="zhangsan"></property>
l <property name="address" value="xi"an"></property>
l </bean>
l <!-- 一下配置中parent="prop"引用上面的抽象bean -->
l <bean id="stu" class="com.xasxt.Student" parent="prop"> <property name="name" value="lisi"></property>
l <property name="code" value="1001"></property>
l </bean>
Ø Spring Bean的作用域
l Scope的取值:
1, singleton:每次调用getBean的时候返回相同的实例
2, prototype:每次调用getBean的时候返回不同的实例
u 采用Annotation方式实现AOP
l 定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,该方法只是一个标识
l Pointcut的内容是一个表达式,描述那些对象的哪些方法
l 采用Aspect定义切面
l 在Aspect定义Pointcut和Advice
l 启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到IOC容器中,
注意:在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点即Advice中通过方法名引用这个切入点。
u AOP
l Cross cutting concern
l Aspect
l Advice
l Pointcut
l Joinpoint
l Weave
l Target Object
l Proxy
l Introduction
u 采用Annotation方式实现AOP(采用静态配置方式)
<aop:config>
<aop:aspect id="bfs" ref="bf">
<aop:pointcut expression="execution(* say*(..))" id="pc"/>
<aop:before method="beforeAdvice" pointcut-ref="pc"/>
<aop:after method="afterAdvice" pointcut-ref="pc"/>
<aop:around method="aroundAdvice" pointcut-ref="pc"/>
</aop:aspect>
</aop:config>
u Spring对AOP的支持
l Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口,如果没有接口必须引入CGLIB库,spring会自动在JDK动态代理和CGLIB之间进行转换。
l 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值,方法名等等。
l 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
l 如果目标对象实现了接口,可以强制使用cglib实现AOP
l 如何强制使用cglib实现AOP
添加cglib库,SPRING_HOME/cglib/*.jar
在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
JDK动态代理和cglib字节码生成的区别?
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
Cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为继承,所以该类或方法最好不要声明成final
u 编程式事务