Spring Boot - 使用不同配置文件自动装配组件

时间:2017-05-09 12:26:15

标签: java spring spring-boot autowired profiles

我有一个组件EmbeddedRedis,它依赖于从应用程序属性文件解析的配置对象RedisConfig。有不同的属性文件,对应于可以运行的可能的应用程序配置文件。因此,在配置文件master中运行时,将根据EmbeddedRedis配置文件设置组件master

在测试类中,应该设置本地Redis集群,我还需要根据所有其他配置文件配置Redis个对象。我在下面使用@Qualifier注释概述了我的想法,但没有带来预期的结果。

@Autowired @Qualifier("dev-cluster-master")
private Redis embeddedRedisMaster;

@Autowired @Qualifier("dev-cluster-slave-001")
private Redis embeddedRedisSlave1;

@Autowired @Qualifier("dev-cluster-slave-002")
private Redis embeddedRedisSlave2;

如何在Spring Boot中存档所需的结果?如果这不能直接工作,那么获取从不同属性文件解析的前面提到的配置对象也就足够了。

@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfig {
 ....
}

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以这样做: 考虑你有一个类定义(在你的例子中是Redis)

public class CustomService {

    private String name;

    public CustomService(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

配置类如:

@Configuration
public class Config {

    @Bean
    @Profile("master")
    CustomService serverConfig1(){
        CustomService service1 = new CustomService("master");
        return service1;
    }

    @Bean
    @Profile("slave")
    CustomService serverConfig2(){
        CustomService service1 = new CustomService("slave");
        return service1;
    }
}

根据当前活动配置文件启动2个不同的对象。如果当前活动的配置文件是“master”,则将执行serverConfig1(),否则将执行serverConfig2()。

最后像这样自动装配你的服务/对象:

@Autowired
CustomService service;

这取决于配置文件中上面执行的bean定义。

属性文件应如下所示:

spring.profiles.active=slave

所以在这个例子中,执行上面的代码后,CustomService service;中'name'的值将是“slave”而不是“master”,因为当前活动的配置文件是“slave”,因此是“serverConfig2()” “将被执行

答案 1 :(得分:0)

您可以执行以下操作:考虑您有一个接口定义:

public interface SomeService {
    String someMethod;
}

和两个实现的类:

@Profile("production")
@Service
public class SomeServiceProd implements SomeService {
     @Override String someMethod() {return "production";}
}

@Profile("development")    
@Service
public class SomeServiceProd implements SomeService {
     @Override String someMethod() {return "development";}
}

并在测试和主要代码中使用此服务:

@Autowired SomeService service;