Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)
JDK动态代理:接口+实现类
cglib字节码增强
实现类:为了更好的理解spring的AOP技术,我们应该手动编写以上两种实现动态代理的方法,然后才能体会到spring实现AOP技术所带来的便利。
2.1、JDK动态代理。
要使用JDK动态代理的类,必须要有接口。这是前提条件。
1.编写UserService接口和UserServiceImpl。
2.创建代理类的工厂proxyFactory
3.增强代码的类
4.测试testApp
测试结果 成功增强了userServiceImpl对象的add方法。如果别的类有需要被增强的方法,那么同样通过创建工厂代理就可以拿到对应的代理对象。然后进行加强
2.2、cglib动态代理
被代理的对象不需要在实现接口,要求就放松了很多。很多时候都采用cglib来进行动态代理。
需要导入两个jar包
spring已经将cglib和asm整合到了spring-core-3.2.0.jar中,所以我们导入spring的jar包就不需要在重复导这两个包了。
跟JDK动态代理的编写流程是一样的
1.UserServiceImpl。没有接口了
2.增强方法的类
3.创建代理的工厂(和jdk动态代理有区别)
成功增强方法。
注意:CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,所以 说被代理的类不能有final关键字