簡體   English   中英

如何指定抽象類的具體實現的哪個版本在Spring中自動裝配?

[英]How to specify which version of a concrete implementation for an abstract class to autowire in Spring?

具有以下類結構:

public abstract class A {
    String someProperty = "property"

    public abstract void doSomething();
}

@Service
public class Aa extends A {

    @Override
    public abstract void doSomething() {
        System.out.println("I did");
    }
}

@Service
public class Ab extends A {

    @Override
    public abstract void doSomething() {
        System.out.println("I did something else");
    }
}

我需要一種方法來告訴Spring A具體的類在我的Foo服務中基於屬性文件中的屬性Autowire

@Service
public class Foo {

    @Autowire
    private A assignMeAConcreteClass;
}

在我的properties文件中,我有這個:

should-Aa-be-used: {true, false}

刪除@Service注釋,而是在讀取屬性的配置類中編寫@Bean -annotated方法 ,並返回相應的A實例。

不是一種新的方式,但在你的情況下,我認為一種可能的合適方式是在想要有條件地注入bean的類中使用FactoryBean
這個想法很簡單:通過使用要注入的bean的接口FactoryBean進行參數化來實現FactoryBean ,並覆蓋getObject()以注入所希望的實現:

public class FactoryBeanA  implements FactoryBean<A> {   

    @Autowired
    private ApplicationContext applicationContext;

    @Value("${should-Aa-be-used}")
    private boolean shouldBeUsed;

    @Override
    public A getObject() {

        if (shouldBeUsed) {
            return applicationContext.getBean(Aa.class));

        return applicationContext.getBean(Ab.class));

    }
}

但是FactoryBean實例不是經典bean。 您必須專門配置它。

您可以通過以下方式在Spring Java配置中配置它:

@Configuration
public class FactoryBeanAConfiguration{

    @Bean(name = "factoryBeanA")
    public FactoryBeanA factoryBeanA() {
         return new FactoryBeanA();
    }

    @Bean
    public beanA() throws Exception {
        return factoryBeanA().getObject();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM