我有一个组件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 {
....
}
提前致谢!
答案 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;