我想定义一个像@PlatformRelated这样的注释,一旦在界面中标记,就会在spring上下文中有一个代理bean,而这个代理bean应该是@Priority.I希望这个代理可以调用不同的工具根据关键参数@ KeyPrameter.And我仍然想在我的Implement1和Implement2中使用@ Async,@ Trasaction等弹簧功能。
@PlatformRelated
interface MyInterface {
method(@KeyPrameter String parameter);
}
@Component
class Implement1 implements MyInterface {
method(String parameter){
//do something 111
}
}
@Component
class Implement2 implements MyInterface {
method(String parameter){
//do something 222
}
}
@Service
class BusinessService{
@Autowired
private MyInterface myInterface;
public void doSomething() {
myInterface.method("key1");
//Implement1 work
myInterface.method("key2");
//Implement2 work
}
}
你们有什么好主意来完成它吗?
答案 0 :(得分:1)
我必须承认我还没有完全理解@Priority的含义,但是,我可以说如果你想在春天实现这个功能,你应该看看Bean Post处理器。
BeanPostProcessors本质上是Spring创建过程的一个钩子,用于改变bean的行为。 除此之外,它们允许将底层bean包装到代理中(CGLIB / java.lang.Proxy,如果您正在使用接口,或者甚至使用编程式Spring AOP),这些代理可以为可以读取的方法执行提供钩子您的注释(如提到的@KeyParameter)并以类似于您已经使用的Aspect代码的方式执行代码。
并非所有bean后处理器都将bean包装到代理中。例如,如果要实现使用“@Autowire”的BPP,则将返回相同的bean,只需“注入”(读取,放置反射)其依赖项。另一方面,如果要使用BPP @Transactional行为实现,那么是的,您应该将bean包装到代理中,该代理将在方法执行之前和之后处理事务管理功能。
完全可以让一个由许多后处理器“改变”的spring bean,其中一些将它包装到一个代理中,其他只会修改并返回相同的bean,如果有很多BPP-s那么将bean包装到代理中我们将获得“代理内部代理内部的代理”(你明白了)。每个代理层都将处理一个特定的行为。
作为示例,我建议您查看现有的Spring后处理器,或者,例如,以下库的源代码:Spring Boot metering integration library
此库包含一些后处理器实现,通过定义Spring Bean方法的注释,允许度量基础架构集成。