昨天,我们主要学习了Spring的控制反转(IOC),IOC容器把对象单独出来,使程序的层次更加分明。Spring的配置比较集中,灵活性比较好。好了,咱们继续昨天AOP的学习。
1.Annotation(注解)的方式实现AOP:
1)加入Spring的依赖库
2)采用Aspect定义切面
3) 在Aspect定义Pointcut和Advice
4)启动Aspect对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中
注意:在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点,即Advice中通过方法名引用这个切入点
2.配置文件的方式实现AOP:
1)加入Spring的依赖库
2)配置文件
配置文件范例:
<aop:config>
<aop:aspect id="security" ref="securityHandler">
<aop:pointcut expression="execution(*cn.itcast.spring.UserManagerImpl.add*(..))"id="addAllMethod"/>
<aop:before method="checkSecurity" pointcut-ref="addAllMethod"/>
</aop:aspect>
</aop:config>
3.Aspect默认情况下不用实现接口,但对于目标对象,在默认情况下必须实现接口,如果没有实现接口必须引入CGLIB库,我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值和方法名等
4.Spring对AOP的支持:
1)如果目标对象实现了接口,默认情况下采用JDK的动态代理实现AOP
2)如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3)如果目标对象没有实现接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换
强制使用CGLIB实现AOP的方法步骤:首先需要添加CGLIB库,SPRING_HOME/cglib/*.jar
然后在配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
5.JDK动态代理和CGLIB字节码生成的区别:
1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承,所以该类或方法最好不要声明成final