创建基本的Java库以使用注释更改方法返回

时间:2019-12-22 21:51:30

标签: java spring spring-boot annotations aop

如何使用AOP概念创建基本库? 我想创建一个包含一些注释和方面的库,并将其配置为其他项目中的依赖项。

是否有一种非侵入性的方式来做到这一点?我不想使用@EnableAspectJAutoProxy配置主项目或插入其他依赖项。

谢谢

2 个答案:

答案 0 :(得分:1)

如果要使用AOP,则需要使用或Spring AOP或AspectJ。 没有@EnableAspectJAutoProxy,您将无法使用AspectJ,请记住,默认情况下JAVA不支持AOP。

答案 1 :(得分:1)

我认为这个问题基本上有两个不同的问题:

  1. 如何在Spring Boot中创建可重用的库
  2. 如何处理相关方面的东西

第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公开的注释的注释)。该代理可以更改带注释的方法的行为,更改结果,缓存结果,监听调用,执行您想做的任何事情。