实例化容器
1、使用静态工厂方法实例化,factory-method指定的必须是个静态方法
<bean id=”” class=””factory-method =”createInstance”/>
2、使用实例工厂方法实例化,factory-name工厂bean 名称,代替class属性,class属性必须为空,factory-method指定工厂方法
<bean id=”ex”factory-name=”myFactory” factory-method=”createInstance”/>
依赖注入
1、ApplicationContext是将所有bean实例化,然后在缓存中读取,开始占用时间长,并能检查出配置文件中的错误。BeanFactory是在调用时才产生bean。
2、默认情况下,bean的scope=”singleton”,内部bean总是匿名而且prototype。Bean或Beans的属性默认default-lazy-init=“false”,spring默认加载配置文件时,默认全部加载,设置为“true”只加载调用部分。
3、<idref>标签用来将容器内其他的id传给<constructor-arg>或<property>,同时提供错误验证功能,允许在容器部署时,验证所被应用的bean是否存在。
4、<ref>标签用来将bean中指定属性的值设置为容器中另一个bean的引用。
l <ref bean=”someBean”/>引用同一容器或父容器内的任何bean,bean属性既可以指定bean的id值也可以是name值。
l <ref local=”someBean”/>引用同一配置文件中的bean,local属性必须指定bean的id值。
l <ref parent=”someBean”/>引用当前容器的父容器中的bean,parent属性可以是bean的id值也可以是name值。
5、将公共的属性定义描述抽取出来:
l 定义公共的注入属性,通过<bean>标签定义,指定abstract=”true”,如<bean id=”comm” abstract=”true”><property>……
l 具有相同注入属性的类,指定parent属性
6、集合:<list><set><map><props>可以定义和设置List、Set、Map、Properties数组对应于<list>标签。
7、集合合并:子集合从父集合继承和覆盖而来,子集合的元素值将覆盖父集合中对应的值。merge=true 属性将父子集合合并。继承需要parent属性。
8、方法注入:如singleton类型的beanA某个方法需要引用另一个非singleton类型beanB时,beanA只会创建一次,这样就没法让A每次创建一个新的B。
l Lookup方法注入:利用spring IoC容器复写bean的抽象或具体方法的能力,从而返回指定名字的bean实例。内部机制是通过CGLIB库的运行时生成二进制代码功能,通过动态创建Loopup方法bean的子类而达到复写Lookup方法的目的。<lookup-method name=””bean=””/>
l 自定义方法:继承MethodReplacer接口,实现reimplement方法,
<bean id=”replacementClass”class=”ReplacementClass”/>
<replaced-methodname="重写的方法名" replacer="replacementClass">
<arg-type>String</arg-type>
</replaced-method>
9、作用域与依赖:如在singleton的beanA中引用一个session的beanB,这样初始化时,beanA中始终调用的只是开始初始化的那个beanB,而通过动态代理,就可以引用实际运行的那个session中的beanB。在beanB中加入<aop:scoped-proxy>,对该bean提供动态代理,beanA再引用时,实际调用代理对象的方法,随后代理对象会在session中获取真正的beanB对象,并将方法调用委派给获取到的实际beanB对象。<aop:scoped-proxy>不能和singleton或prototype的bean一起使用。
10、 Bean的生命周期:
l bean的构造函数
l 调用setxxx()方法设备bean属性
l 调用BeanNameAware的setBeanName()方法
l 调用BeanFactoryAware的setBeanFactory()方法
l 调用BeanPostProcessor的postProcessBeforeInitialization()方法
l 调用InitializingBean的afterPropertiesSet()方法
l 调用自定义的初始化方法 init-method=“xxx”
l 调用BeanPostProcessor的postProcessAfterInitialization()方法
l 调用DisposableBean的destroy()方法
l 调用自定义的销毁方法 destroy-method=“xxx”
11、 在非web应用中优雅地关闭SpringIoC容器,以及所有由单例持有的资源都会被释放,为了注册“关闭钩子”,你只需要简单地调用在AbstractApplicationContext实现中的registerShutdownHook()方法即可
12、 国际化:当一个ApplicationContext被加载时,它会自动在context中查找已定义为MessageSource接口类型的bean。此bean的id名称必须为messageSource,实现类ResourceBundleMessageSource,可以配置String bansename或者String[]basenames。
13、 属性编辑器
作用:属性编辑器,是将spring配置文件中字符串转换成对象进行注入
Spring内置许多属性编辑器,也可以自定义属性编辑器。
定义:继承PropertyEditerSupport类,重写setAsText()方法,方法最好将对象setValue()中,属性编辑器注册到spring中,定义如下:
<!-- 注册属性编辑器 -->
<beanid="customEditorConfigurer"class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<propertyname="customEditors">
<map>
<entrykey="java.util.Date">
<beanclass="com.spring.util.UtilDatePropertyEditor">
<propertyname="format" value="yyyy/MM/dd"/>
</bean>
</entry>
</map>
</property>
</bean>
Spring2.5新特性
@Autowired 自动注入,byType
@Qualifier(“name”) 将自动注入变成byName,只能和@Autowired结合使用,是对@Autowired的补充。自定义的限定器注解,定义一个注释时提供@Qualifier注释就可以了。
<context:annotation-config/>
AOP:切面默认情况不需要接口
1、目的对象为接口,则使用JDK的动态代理机制实现AOP。
2、目标对象为类或者接口,可以强制使用Spring采用CGLIB实现代理。引入CGLIB库,并且设置属性proxy-target-class="true"。Spring会自动在CGLIB和JDK动态代理之间切换。
JDK代理和CGLIB生成代理区别:
1、JDK只能针对接口生成动态代理,不能针对类
2、CGLIB针对类实现代理,主要是生成指定类的子类,并覆盖其中方法实现类增强,因为采用的是继承,所以无法对final的类或方法实现代理。
切面的三种方式:
注意:1、2两种方法可以在Advice中加入JoinPoint参数,该参数Spring会自动传入,可以从JoinPoint中取出目标对象相关信息,如:getThis()返回代理对象,getTarget()返回目标对象,getArgs()返回连接点方法的参数
1、通过注释方式编写切面方式
* 声明切面@Aspcet
* 定义切入点和切入点表达式@Pointcut(“execution(...)”)
1.切入点表达式通配符
“*”匹配所有除了“.”以为的字符,一般匹配单个包、方法、参数等
“..” 匹配所有字符,一般用于匹配多个包、参数;
“+”表示类及子类。
2.切入点关键字
within 用于匹配连接点所在的java类或者包,它定义的某个包及其子包中所有类的方法都会被匹配
this 可以向通知方法中传入代理对象的引用;
target 可以向通知方法中传入目标对象的引用;
args
bean spring2.5新增,通过受管bean的名字来限定连接点所在的bean @within匹配在类一级使用了参数确定的注解类,其所有方法将被匹配
如@Before(“@within(MyPointcut)”) utoint()visorAutoProxyCreator被MyPointcut注释的类将被匹配
@targer和@within类似,但必须指定注解类的保留策略为runtime
@arg 传入连接点的参数类型必须被@arg指定的注解类注解才被匹配
@annotation 任何一个执行方法有该注释的连接点
* 定义Advice
1.前置通知@Before在连接点被调用之前触发
2.后置通知@AfterReturning连接点返回后被触发,但非正常返回或抛出异常将不被触发;returning属性用来绑定连接点方法的返回值,advice中必须有以以个名字和绑定参数名字相同的参数,返回值会被传到advise中
如:@AfterReturning(pointcut=”poinrcut()”,returning=”return”)
publicvoid afterReturning(Object return)
3.@AfterThrowing在连接点抛出异常时被触发。throwing属性可以得到连接点中抛出的异常,该异常将作为参数传入advise,只有异常与advise异常参数类型一致时才会触发该通知;
4.最终通知@After不论一个方法是如何结束的,最终通知都会运行,最终通知必须准备处理正常返回和异常返回两种情况。通常用来释放资源。
5.环绕通知@Around advise第一个参数必须是ProceedingJoinPoint,并且需要执行该参数的proceed方法来调用连接点方法,proceed可以调用零次或多次。
* 在Spring配置文件中添加<aop:aspectj-autoproxy/>,让Spring启用AspectJ的Annotation支持并自动产生代理,定义Aspect目标类的<bean>
注意:在这种方法中,切入点的方法是不被执行的,他存在的目的仅仅为了重用切入点的定义(即可以在advice中,通过方法名称引用在个切入点)
2、通过xml配置方式(在xml配置中,逻辑运算分别要用“and”“or”“not”)
<aop:config>
<aop:aspectid="securityAspect" ref="security">
<aop:pointcutid="allAdd" expression="execution(* add*(..))"/>
<aop:beforepointcut-ref="allAdd" method="checkSecurity"/>
<aop:afterpointcut="execution(* add*(..))"method="checkSecurity2"/>
<aop:after-returning pointcut-ref=""method="" returning=""/>
<aop:after-throwing pointcut-ref=""method="" throwing=""/>
<aop:around pointcut-ref=""method=""/>
</aop:aspect>
…
</aop:config>
引用另一个切入点(要用全路径标识引用的切入点)
<aop:pointcut id="test"expression="aop.test.MyAspect.Pointcut()"/>
3、配置代理方式
* 配置Spring代理
1.ProxyFactoryBean:proxyInterfaces属性指定代理接口,target指定代理类,interceptorNames属性指定通知或者通知者列表;
2.BeanNameAutoProxyCreator:通过bean的name属性来指定代理的bean,其中beanNames属性指定代理bean的名称列表,支持“*”通配符,interceptorNames指定通知或者通知者列表;
3.DefaultAdvisorAutoProxyCreator允许只定义相应的通知者,就可以完成自动代理,它会自动查找配置文件中的Advisor并将他们作用与所有bean。
* 指定通知者
1、DefaultPointAdvisor:默认的通知者,默认会将切入点包括类所有方法,支持所有Piontcut,功能最强大;
2、NameMatchMethodPointcutAdvisor:内置它的Advisor使用它可以不必单独再配置NameMatchMethodPointcut,mappedName和mappedNames属性定义切入点中的方法,order属性定义加载顺序;
3、RegexpMethodPointcutAdvisor:内置了JDK正则表达式切入点的JdkRegexpMethodPointcut的Advisor,advice属性指定Advice方法,pattern属性指定匹配模式
Spring的五种通知方式
1.前置通知:实现接口MethodBeforeAdvice的before方法;
2.后置通知:实现接口AfterReturningAdvice的afterReturning方法;
3.环绕通知:实现接口MethodInterceptor的invoke方法,其中必须调用MethodInvocation的proceed方法,来执行目标对象的方法;
4.异常通知:实现ThrowsAdvice标志接口,实现类必须要有一个异常处理方法,格式:void afterThrowing(Method method,Object[] args,Objectarg,Throwable th) 其中前三个参数可以选,Throwing是必须的,springAOP会自动选择重载方法: voidafterThrowing(RuntimeException re)
void afterThrowing(RemoteExceptions re) …
5.引介通知:是类级别的通知,能将新的成员变量、成员方法引入到目标类中,spring推荐扩展类DelegatingIntroductionInterceptor来定义自己的引入通知,它IntroductionInterceptor接口的invoke方法,如需要重写该方法获得目标对象的方法、参数和返回值等,使用return super.invoke0就可以实现该功能。引入通知只能和它的专有通知者IntroductionAdvisor一起使用,而不兼容其他通知者,因为他应用在类级别其他通知应用在方法级别,spring提供了实现类DefaultIntroductionAdvisor。
事务管理
1、使用资源同步事务
l 高层次方案:采用模板方法HibernateTemplate
等
l 低层次方案:SessionFactoryUtils
(针对Hibernate)等
2、声明式事务管理:通过Spring AOP实现的;声明式事务管理可以在任何环境下使用,只需更改配置文件;Spring允许通过AOP定制事务行为,可以在事务回滚中插入定制的行为,可以增加任意的通知,就象事务通知一样。