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

Create proxy for a interface, which could inject by @Autowired, proxy invokes different implement by key parameter

我想定义一个像@PlatformRelated这样的注解,一旦在接口中被标记,在spring上下文中就会有一个代理bean,这个代理bean应该是@Priority.I想要的这个代理可以根据关键参数调用不同的实现 @KeyPrameter.And 我仍然想在我的 Implement1 和 Implement2 上使用 spring 功能,如 @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
    }
}

你们有什么好的想法来完成它吗?

我必须承认我还没有完全理解@Priority 的含义,但是,我可以说如果你想在 spring 中实现这个特性,你应该看看 Bean Post 处理器。

BeanPost处理器本质上是 spring 中用于改变 bean 行为的 Bean 创建过程的挂钩。 除其他外,它们允许将底层 bean 包装到代理中(CGLIB/java.lang.Proxy 如果您正在使用接口,或者甚至以编程方式使用 Spring AOP),这些代理可以提供挂钩到可以读取您的注释(如提到的@KeyParameter)的方法执行,并以类似于您已经使用的 Aspect 代码的方式执行代码。

并非所有 bean post 处理器都将 bean 包装到代理中。例如,如果您想实现一个使用“@Autowire”的 BPP,您将 return 同一个 bean,只是 "inject"(通过反射读取、放置)它的依赖项。另一方面,如果您想使用 BPP @Transactional 行为来实现,那么是的,您应该将 bean 包装到一个代理中,该代理将在方法执行前后处理事务管理功能。

有一个 spring bean 被许多 post 处理器获取 "altered" 是完全没问题的,其中一些处理器会将其包装到代理中,其他处理器只会修改-和-return 同一个 bean,如果有很多 BPP-s 将 bean 包装到代理中,我们将得到 "proxy inside proxy inside proxy"(你懂的)。每层代理将处理一个特定的行为。

例如,我建议您查看现有的 Spring post 处理器,或者,例如,以下库的源代码:Spring Boot metering integration library

此库包含 post 处理器的一些实现,这些处理器通过在 Spring Beans 的方法上定义注释来允许度量基础结构集成。