gpt4 book ai didi

java - 为接口(interface)创建代理,可以通过@Autowired注入(inject),代理通过关键参数调用不同的实现

转载 作者:行者123 更新时间:2023-12-02 11:17:02 24 4
gpt4 key购买 nike

我想定义一个像@PlatformRelated这样的注释,一旦在接口(interface)中被标记,在spring上下文中就会有一个代理bean,并且这个代理bean应该是@Priority。我希望这个代理可以根据不同的实现调用不同的实现关键参数@KeyPrameter。而且我仍然想在我的Implement1和Implement2中使用@Async、@Trasaction等Spring功能。

@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 Processors。

BeanPostProcessors 本质上是 Spring 中 Bean 创建过程的 Hook ,旨在改变 Bean 行为。除此之外,它们允许将底层 bean 包装到代理中(CGLIB/java.lang.Proxy,如果您正在使用接口(interface),甚至以编程方式使用 Spring AOP),这些代理可以为方法执行提供一个钩子(Hook),可以读取您的注释(如提到的 @KeyParameter)并以与您已经使用的 Aspect 代码类似的方式执行代码。

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

拥有一个被许多后处理器“更改”的 Spring bean 是完全可以的,其中一些处理器会将其包装到代理中,其他处理器只会修改并返回相同的 bean,如果有很多 BPP-s将 bean 包装到 proxy 中,我们将得到“proxy inside proxy inside proxy”(你明白了)。每一层代理都会处理一个特定的行为。

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

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

关于java - 为接口(interface)创建代理,可以通过@Autowired注入(inject),代理通过关键参数调用不同的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com