Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

JDK动态代理:接口+实现类

cglib字节码增强

实现类:为了更好的理解spring的AOP技术,我们应该手动编写以上两种实现动态代理的方法,然后才能体会到spring实现AOP技术所带来的便利。

 2.1、JDK动态代理

          要使用JDK动态代理的类,必须要有接口。这是前提条件。

                Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

          1.编写UserService接口和UserServiceImpl。 

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

          2.创建代理类的工厂proxyFactory

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

            3.增强代码的类

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

            4.测试testApp

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

            测试结果 成功增强了userServiceImpl对象的add方法。如果别的类有需要被增强的方法,那么同样通过创建工厂代理就可以拿到对应的代理对象。然后进行加强

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

                  

                  

2.2、cglib动态代理

被代理的对象不需要在实现接口,要求就放松了很多。很多时候都采用cglib来进行动态代理。

            需要导入两个jar包

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

            spring已经将cglib和asm整合到了spring-core-3.2.0.jar中,所以我们导入spring的jar包就不需要在重复导这两个包了。

            跟JDK动态代理的编写流程是一样的

            1.UserServiceImpl。没有接口了

                  Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)

            2.增强方法的类

                   Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib) 

          

            3.创建代理的工厂(和jdk动态代理有区别)

                    Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)  

 

     成功增强方法。

注意:CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,所以                说被代理的类不能有final关键字