maven aspectj
Spring框架附带AOP支持。 实际上,如Spring参考文档中所述 ,
“ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP,这意味着您不需要使用AOP,但AOP是对Spring IoC的补充,以提供一种功能强大的中间件解决方案。 AOP在Spring框架中用于…
- …提供声明性企业服务,尤其是代替EJB声明性服务。 此类服务中最重要的是声明式事务管理。
- …允许用户实现自定义方面,并通过AOP补充其对OOP的使用。 ”
尽管如此,与完整的AOP实现(例如AspectJ)相比, Spring AOP框架还是有某些限制。 人们在使用Spring AOP框架时遇到的最常见问题源于Spring AOP是“基于代理的”这一事实。 换句话说,当将bean用作依赖项,并且应根据特定方面建议其方法时,IoC容器将注入“方面感知” bean代理,而不是bean本身。 对用户透明地对代理bean实例执行方法调用,以便在将调用委派给实际的“代理” bean之前和/或之后执行方面逻辑。
此外, Spring AOP框架使用JDK动态代理或CGLIB创建给定目标对象的代理。 第一个只能为接口创建代理,而第二个可以代理具体类但有一定限制。 特别是,如Spring参考文档中所述 ,
“ 如果要代理的目标对象实现了至少一个接口,则将使用JDK动态代理。 目标类型实现的所有接口都将被代理。 如果目标对象未实现任何接口,则将创建CGLIB代理。 ”
总而言之,在使用Spring AOP框架时,您应该牢记两个重要事项:
- 如果您的“代理” bean实现了至少一个接口,则只能将代理bean强制转换为该接口。 如果尝试将其强制转换为“代理” bean类,则应期望在运行时引发ClassCastException。 尽管如此, Spring AOP框架提供了强制CGLIB代理的选项,但有上述限制(请参阅Spring参考文档的相关章节)
- 方面不适用于术中呼叫。 这意味着代理无法拦截来自相同“代理” bean的另一个方法的方法的调用
我们建议克服以上问题的方法是使用AspectJ编织。 换句话说,将方面逻辑直接注入到目标类中,并消除了代理所有方法的必要性。 有三种方法可以注入AspectJ方面所隐含的指令:
- 编译时间编织–通过AspectJ编译器编译目标源或方面类
- 编译后编织–向已编译的类注入方面指令
- 加载时间编织–在类加载期间将方面指令注入字节码
可以使用上述任何方法。 在本教程中,