1

我正在开发一个弹簧启动应用程序。我们有每个环境的属性文件(dev、int、qa、prd 等)。至于 bean,有些需要以不同的方式创建以用于生产。所以我们有这样的配置:

@Configuration
class MyBeans {
    @Bean(name="someBean")
    @Profile("prd")
    MyBean someBeanProd() {
        ...
    }

    @Bean(name="someBean")
    MyBean someBeanDev() {
        ...
    }
}

MyBean 自动装配如下:

@Component
public class SomeService 
{
    @Autowired
    private MyBean someBean;
}

启动应用程序时:

-Dspring.profiles.active=prd

正在调用“someBeanProd”方法(如预期的那样),并且正在加载相关的属性文件(application-prd.properties)。对于任何其他配置文件“someBeanDev”正在被调用(如预期的那样)并加载相关的属性文件。

但是,如果我如下更改配置中方法的顺序,则始终调用“someBeanDev”方法(即使活动配置文件为 prd),但正在使用正确的属性文件。

@Configuration
class MyBeans {
    @Bean(name="someBean")
    MyBean someBeanDev() {
        ...
    }

    @Bean(name="someBean")
    @Profile("prd")
    MyBean someBeanProd() {
        ...
    }
}

这是正确/预期的行为吗?无论配置文件中方法的顺序如何,我都希望 spring 创建正确的 bean。

有没有办法为一个配置文件定义一个bean,并且任何其他配置文件都应该回退到“默认”配置文件?

在不同的 Java 配置类中创建 prd bean 也不起作用。

4

2 回答 2

0

您可以使用任何一种@Primary(不指定bean的名称):

@Bean
public MyBean someBeanDev() {
    return new MyBean("dev");
}

@Primary
@Profile("prd")
@Bean
public MyBean someBeanProd() {
    return new MyBean("prod");
}

在这种情况下,如果 profile 为“prd”,则两个 @Bean 方法都会被调用,但其中任何一个@Autowired MyBean都将只有 someBeanProd() 返回的 MyBean。如果您还想拥有@Autowire Collection<MyBean>.

@ConditionalOnMissingBean与 bean 名称(或具有value属性的 bean 类)一起使用:

@Configuration
public class ConfProd {

    @Profile("prd")
    @Bean(name = "someBean")
    public MyBean someBeanProd() {
        return new MyBean("prod");
    }
}

@Configuration
public class ConfDev {

    @ConditionalOnMissingBean(name = "someBean")
    @Bean(name = "someBean")
    public MyBean someBeanDev() {
        return new MyBean("dev");
    }
}

在这种情况下,只有一个@Bean 方法被称为依赖于指定的配置文件。

于 2015-10-21T09:28:31.183 回答
0

我也注意到了这种行为,一种解决方法是将不同的配置文件 bean 保留在不同的 @Profile 注释类中(这有点麻烦,但我记得它工作正常)

例如

假设您的生产配置文件中有 bean1 和 bean2 的两个实现,而暂存配置文件有两个不同的实现

你想创建两个配置类

@Configuration
@Profile({"production"})
public class ConfigProduction {
  @Bean Bean1 bean1(){ return prod impl;}]
  @Bean Bean2 bean2(){ return prod impl;}
}

@Configuration
@Profile({"staging"})
public class ConfigStaging {
  @Bean Bean1 bean1(){ return staging impl;}]
  @Bean Bean2 bean2(){ return staging impl;}
}

在您的默认 application.properties 中将生产(或您喜欢的任何内容)设置为活动配置文件

spring.profiles.active=production,具有类似“后备”的行为

试试看

于 2015-10-23T08:43:23.230 回答