为接口创建代理,可以通过@Autowired注入,代理通过key参数调用不同的实现

时间:2018-05-06 09:49:19

标签: java spring spring-boot reflection inject

我想定义一个像@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
    }
}

你们有什么好主意来完成它吗?

1 个答案:

答案 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方法的注释,允许度量基础架构集成。