多个 Spring 配置文件(每个配置文件一个)
Multiple Spring Configuration files (one per Profile)
我是一名 Spring 新手,我正试图从 Spring 的简单 'profile' 处理的优势中获益。我已经完成了本教程:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile,现在我想将该概念应用到一个简单的示例中。
我有两个配置文件:dev
和 prod
。我想象每个配置文件都有一个 @Configuration
class,我可以根据设置的配置文件实例化不同的 bean(分别实现一个通用接口)。
我目前使用的 class 是这样的:
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
我的方法与推荐配置相去甚远吗?在我看来,用 @Profile
注释来注释每个 Configuration
比对每个 bean 都这样做更有意义,并且可能在稍后添加新的 classes 时忘记一些变体.
您对 EnvironmentAwareBean
的实现都带有 @Service
注释。
这意味着它们都将被组件扫描拾取,因此您会得到不止一个匹配的 bean。是否需要用 @Service
注释?
用 @Profile
注释对每个 @Configuration
进行注释就可以了。作为教育练习的另一种方法是不使用 @Profile
而是使用您自己的 @Conditional
.
的实现来注释 @Bean
或配置 类
我是一名 Spring 新手,我正试图从 Spring 的简单 'profile' 处理的优势中获益。我已经完成了本教程:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile,现在我想将该概念应用到一个简单的示例中。
我有两个配置文件:dev
和 prod
。我想象每个配置文件都有一个 @Configuration
class,我可以根据设置的配置文件实例化不同的 bean(分别实现一个通用接口)。
我目前使用的 class 是这样的:
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
我的方法与推荐配置相去甚远吗?在我看来,用 @Profile
注释来注释每个 Configuration
比对每个 bean 都这样做更有意义,并且可能在稍后添加新的 classes 时忘记一些变体.
您对 EnvironmentAwareBean
的实现都带有 @Service
注释。
这意味着它们都将被组件扫描拾取,因此您会得到不止一个匹配的 bean。是否需要用 @Service
注释?
用 @Profile
注释对每个 @Configuration
进行注释就可以了。作为教育练习的另一种方法是不使用 @Profile
而是使用您自己的 @Conditional
.
@Bean
或配置 类