如何使用AOP概念创建基本库? 我想创建一个包含一些注释和方面的库,并将其配置为其他项目中的依赖项。
是否有一种非侵入性的方式来做到这一点?我不想使用@EnableAspectJAutoProxy配置主项目或插入其他依赖项。
谢谢
答案 0 :(得分:1)
如果要使用AOP,则需要使用或Spring AOP或AspectJ。 没有@EnableAspectJAutoProxy,您将无法使用AspectJ,请记住,默认情况下JAVA不支持AOP。
答案 1 :(得分:1)
我认为这个问题基本上有两个不同的问题:
第1部分
要回答问题的第一部分,我建议阅读有关弹簧工厂的文章。 这种机制基本上允许定义一个自动配置,以便当您使用spring factory导入模块时,客户的spring boot应用程序将自动检测到您的bean,并将它们加载到应用程序上下文中。
一旦掌握了这个概念,您就会发现不同的spring boot项目具有不同的组件扫描策略,因此您真的想依赖于组件扫描,因此您将创建一个Java Config,在其中注册所有你的豆子。
将在@Configuration
中指定此Java配置(带有注释的类spring.factories
),这是IMO在这种情况下肯定会带来的一笔小开销。
关于此模块的API,最好的方法可能是定义runtime
保留策略的一些注释,以便该模块的用户在其代码中使用它们。他们将拥有这些注释,因为它们应该将您的模块添加为对其代码的依赖。
最后一点是:该库的模块应该是常规JAR而不是Spring Boot应用程序之类的东西,因此您无需在此处使用spring-boot-maven-plugin
第2部分
现在第二部分。 是的,AOP可以在这里为您工作,但是这将要求应用程序引入整个AOP框架。尽管有可能,但我认为这不是理想的方法:许多人不会真的喜欢这种方法,因为它说明其过于侵入性。
在春季看来,有一个BeanPostProcessors的概念。在这种情况下,这可能是一个更好的选择。本质上,您可以实现与Spring AOP类似的结果,但无需真正引入AOP。
关于bean后处理器的材料很多,给你一个想法,它们是常规的bean(这就是为什么我谈论bean的java配置的原因),而spring则对此有所不同:
一旦加载,它们便可以应用于所有其他bean,除其他外,它们还可以在运行时生成的代理中包装似乎相关的bean(读取带有模块API公开的注释的注释)。该代理可以更改带注释的方法的行为,更改结果,缓存结果,监听调用,执行您想做的任何事情。