我怎么能多次覆盖自动装配的bean?考虑这个3层结构:
库1 定义了一个接口和一个默认实现。
public interface Foo {}
@Component
public class FooImpl1 implements Foo {}
在所有3层中,该接口将用于自动装配。
@Autowired
private Foo foo;
库2 依赖于库1,并提供自己的实现,必须覆盖第一个,即自动装入库1的现有代码。
@Component
public class FooImpl2 implements Foo {}
实际的应用程序依赖于库2,还提供了另一种必须覆盖前者的实现。
@Component
public class FooImpl3 implements Foo {}
如何配置?如果只有两个图层,我可以使用@Primary
,但这不适用于两个以上的图层,因为@Primary
无法再次覆盖。是否有一种更细粒度的方法可以优先考虑我忽略的bean,或者我可以使用@Configuration
完成第二次覆盖,或者你不能多次覆盖bean,我不得不求助于某种静态助手如FooProvider.getFoo()
而不是自动装配?
答案 0 :(得分:0)
可能不是这种情况,但是当你有多个实现并希望建立某种排序时,请注释注释@order
@order(3)
@Component
public class FooImpl1 implements Foo {}
@order(1)
@Component
public class FooImpl2 implements Foo {}
@order(2)
@Component
public class FooImpl3 implements Foo {}
public class PrintFoo {
List<Foo> fooList;
@autowired
public PrintFoo() {
for(Foo fooImpl: fooList) {
System.out.println(fooImpl.getClass().getSimpleName());
}
}
输出应为: