AOP是什么?
Aspect Oriented Programming,面向切面编程。
如果类的继承是纵向的复用代码,那AOP就是横向地复用代码,不同接口的实现类、或者不同类的子类之间,由于没有公共的接口或者祖先,没有办法统一地复用代码,就可以使用AOP来横向地复用代码。
什么情况下需要使用Spring AOP
- 事务
被声明式事务注解@Transactional注解的方法 - 过滤器
被过滤器过滤的接口 - 器拦截
被拦截器拦截的接口 - init-method
当指定了init-method方法时
当使用了@PostConstruct来注解初始化方法时。
Spring AOP有哪些实现方式?
- JDK动态代理
- CGLIB动态代理
JDK动态代理
- 什么情况下使用JDK动态代理
用户自定义的Spring Bean实现了用户自定义的接口IServiceA的时候,则Spring AOP是通过JDK动态代理进行实现AOP。
假设被代理的目标类叫做Aservice,Aservice实现类接口IAservice,JDK动态代理会对Aservice进行代理
JDK动态代理是通过运行时生成接口的子类,该子类的包名是class com.sun.proxy,而全限类名一般是class com.sun.proxy. P r o x y 2 , Proxy2, Proxy2,Proxy2会继承IServiceA,然后实现IServiceA中的所有方法,并使用反射对AService类中的方法进行调用。 - JDK动态代理是怎么运作的?
在运行时,动态生成新的字节码文件,新的字节码文件具有被代理目标类的所有方法,并且对切点(目标方法)进行了增强。
CGLIB动态代理
用户自定义的Spring Bean,叫做Bservice,如果没有实现接口,则Spring AOP是通过CGLIB动态代理实现AOP。
CGLIB会生成一个新的类,继承Bservice,新的类一般叫做EnhanceBserviceCglib,EnhanceBserviceCglib中有增强的业务代理,且EnhanceBserviceCglib会继承Bservice,然后直接通过super.xxxMethod()的方式调用父类(被代理的目标类)的方法。