我是一名春天新秀,并试图从简单的配置文件中获益['处理春天。我已经完成了本教程:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile,现在我想将这个概念改编成一个简单的例子。
我有两个配置文件:dev
和prod
。我想为每个配置文件设一个@Configuration
类,我可以根据设置的配置文件实例化不同的bean(分别实现一个公共接口)。
我目前使用的课程如下:
StatusController.java
@RestController
@RequestMapping("/status")
public class StatusController {
private final EnvironmentAwareBean environmentBean;
@Autowired
public StatusController(EnvironmentAwareBean environmentBean) {
this.environmentBean = environmentBean;
}
@RequestMapping(method = RequestMethod.GET)
Status getStatus() {
Status status = new Status();
status.setExtra("environmentBean=" + environmentBean.getString());
return status;
}
}
EnvironmentAwareBean.java
public interface EnvironmentAwareBean {
String getString();
}
EnvironmentAwareBean.java
@Service
public class DevBean implements EnvironmentAwareBean {
@Override
public String getString() {
return "development";
}
}
EnvironmentAwareBean.java
@Service
public class ProdBean implements EnvironmentAwareBean {
@Override
public String getString() {
return "production";
}
}
DevConfig.java
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public EnvironmentAwareBean getDevBean() {
return new DevBean();
}
}
ProdConfig.java
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public EnvironmentAwareBean getProdBean() {
return new ProdBean();
}
}
运行示例会在启动期间抛出此异常(SPRING_PROFILES_DEFAULT
设置为dev
):
(...)UnsatisfiedDependencyException :( ...)嵌套异常是org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有定义[EnvironmentAwareBean]类型的限定bean:期望的单个匹配bean但找到3:prodBean,devBean ,getDevBean
我的方法远非推荐的配置吗?在我看来,使用Configuration
注释来注释每个@Profile
更有意义,而不是为每个bean添加它,并且可能在稍后添加新类时忘记一些变体。
答案 0 :(得分:2)
EnvironmentAwareBean
的实施都使用@Service
注释。
这意味着它们将全部通过组件扫描获取,因此您将获得多个匹配的bean。是否需要使用@Service
进行注释?
使用@Configuration
注释对每个@Profile
进行注释很好。作为教育练习的另一种方式是不使用@Profile
,而是使用您自己的@Bean
实现来注释@Conditional
或Config类。