AOP简介:
AOP (Aspect Oriented Programming):面向切面程序,通过预编译方式和运行动态代理实现程序功能的统一维护的一种技术
主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等
AOP的实现方式:
- 预编译:AspectJ
- 运行期动态代理(JDK动态代理、CGLib动态代理):SpringAOP、JbossAOP
Spring框架中AOP的用途:
- 提供了声明式的企业服务,特别是EJB的替代服务的声明
- 允许用户定制自己的方面,已完成OOP与AOP的互补使用
- AOP面向对象 OOP各个方面横切
Spring的AOP实现:
- 纯java实现,无需特殊的编译过程,不需要控制类加载器层次
- 目前只致辞方法执行连接点(通知Spring Bean的方法执行)
- 不是为了提供最完整的AOP实现,而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中的常见问题
- Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方法
有接口和无接口的Spring AOP实现区别:
- Spring AOP默认使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理
- Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)
切点:
ProxyFactoryBean:
- 创建Spring AOP代理的基本方法是使用org.springframework.org.framework.ProxyFactoryBean
- 这恶意完全控制切入点和通知(advice)以及他们的顺序
- 使用ProxyFactoryBean或者其他IOC相关类来创建AOP代理的最重要好出是通知和切入点也可以由IOC来管理
- 被代理类没有实现任何接口,使用CGLIB代理,否则JDK代理
- 通过设置ProxyTargetClass为true,可强制使用CGLIB
- 如果目标类实现了一个(或者多个)接口,那么创建代理的类型将依赖ProxyFactoryBean的配置
- 如果ProxyFactoryBean和ProxyInterfaces属性被设置为一个或多个全限定接口名,基于JDK的代理将被创建
- 如果ProxyFactoryBean的ProxyFactoryfaces属性没有被设置,但是目标类实现了一个(或者更多)接口,那么ProxyFactoryBean将自动检测到这个目标类已经实现了至少一个接口,创建一个基于JDK的代理