自动给定配置文件的特定bean

时间:2018-08-23 04:54:03

标签: java spring

我有2个实现InterfaceA的类

@Service("classA")
class ClassA implements InterfaceA

@Service("classB")
class ClassB implements InterfaceA

我需要加载两个bean。但是,在C和D类中,我需要指定所需的Bean

class ClassC {
    @Autowired
    @Qualifier("classA")
    private InterfaceA interf;
}

class ClassD {
    @Autowired
    @Qualifier("classA")
    private InterfaceA interf;
}

但是,我有2个配置文件,即profile1和profile2。如果我使用-Dspring.profiles.active = profile1,则应该对classC和classD使用限定符“ classA”。如果我使用-Dspring.profiles.active = profile2,则应使用“ classB”作为限定符。另外,无论概要文件如何,另一个ClassE都应始终使用classB。您能告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:0)

这就是我的做法。我创建了一个配置类

@Configuration
public class ConfigClass {
    @Autowired
    private ClassB classB;

    @Profile("profile1")
    @Qualifier("myclass")
    @Bean
    private InterfaceA classAtProfile1() {return new ClassA();}

    @Profile("profile2")
    @Qualifier("myclass")
    @Bean
    private InterfaceA classAtProfile2() {return classB;}
}

class ClassA implements InterfaceA

@Service("classB")
class ClassB implements InterfaceA

这样,我可以根据配置文件自动连接InterfaceA

@Autowired
@Qualifier("myclass")
private InterfaceA myclass;

尽管ClassE仍然可以引用classB

@Component
public class ClassE {
    @Autowired
    ClassB classB;
    ...
}

答案 1 :(得分:-1)

定义2个配置Java文件:

class ClassA implements InterfaceA

class ClassB implements InterfaceA

示例配置文件1:

Profile1Config.java

 @Configuration
 @Profile("profile1")
 public class Profile1Config {
    @Bean
    public InterfaceA interfaceA() {
       return new ClassA();
    }
 }

示例配置文件2:

Profile1Config.java

 @Configuration
 @Profile("profile2")
 public class Profile2Config {
    @Bean
    public InterfaceA interfaceA() {
       return new ClassB();
    }
 }

以及您想在哪里使用它:

class ClassC {
   @Autowired
   private InterfaceA interf;
}

class ClassD {
    @Autowired
    private InterfaceA interf;
}

要注意的重点: 1.不需要@Qualifier。 2. Java配置类中提到了@Profile。 3. @Service已从classA和classB中删除,而现在已在Config *类中定义。