Spring的关于方法的@Profile是一个很好的做法

时间:2016-08-12 14:26:27

标签: java spring maven spring-boot spring-profiles

我有一个暴露休息服务的Spring Boot Web应用程序。

我问自己如何正确管理过滤器上的配置文件。 实际上,我的应用程序有2个配置文件:dev和prod(你猜它代表什么......)

在产品模式下,我有比激活模式更多的激活过滤器。

我的过滤器配置类如下:

@Configuration
public class FiltersConfig {

    @Bean
    public FilterRegistrationBean filterRegistrationBean(CompositeFilter compositeFilter){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setFilter(compositeFilter);
        return filterRegistrationBean;
    }

    @Bean
    @Profile("dev")
    public CompositeFilter devCompositeFilter(){
        CompositeFilter compositeFilter = new CompositeFilter();
        List<Filter> filtersList = new ArrayList<>();
        //filtersList.add(filter1());
        compositeFilter.setFilters(filtersList);
        return compositeFilter;
    }


    @Bean
    @Profile("prod")
    public CompositeFilter prodCompositeFilter(){
        CompositeFilter compositeFilter = new CompositeFilter();
        List<Filter> filtersList = new ArrayList<>();
        //filtersList.add(filter1());
        compositeFilter.setFilters(filtersList);
        return compositeFilter;
    }
}

我的问题是:

  • 在方法上添加@Profile是一个好习惯吗?
  • 有没有办法强制编译器排除使用不同于当前设置的配置文件注释的类,方法等? (我不希望我的生产jar / war填充不必要的代码!)
  • Spring boot是否提供了更清晰的方式来组织配置文件?

THX。

3 个答案:

答案 0 :(得分:1)

我认为在不同的包中为不同的环境配置会更好。您不想混合配置。 结构可能如下所示:

config
    - Config1.java
    - Config2.java
    dev
        - WebConfig.java
        - DataConfig.java
    prod
        - WebConfig.java
        - DataConfig.java

答案 1 :(得分:0)

  

在方法上添加@Profile是一个好习惯吗?

这是解决这个问题的春天方法 - 因此它与春季生态系统保持一致

  

有没有办法强制编译器排除使用不同于当前设置的配置文件注释的类,方法等? (我不希望我的生产jar / war填充不必要的代码!)

您必须调整构建以排除类 - 另一种方法是使用id配置bean,并使用每个环境的ID和配置。类似于to

的方法

根据我的经验,个人资料更容易

  

Spring boot是否提供了更清晰的方式来组织配置文件?

我不知道,除了上面链接中的方法

答案 2 :(得分:0)

根据我自己的经验,在任何java代码中使用@Profile都不是一个好主意。这就是为什么我认为你必须避免在代码中使用它:

  1. 您始终可以使用个人资料定义my.feature-for-the-profile.enable等属性,以达到相同的目标。
  2. 配置文件有时会发散,保持每个不断变化的配置,因为属性可以让您在任何地方对所有内容进行更多控制。
  3. Spring Boot具有明确定义的特定于配置文件的外部化属性支持(如application-prod.yml)。在您的代码库中使用配置文件会使事情变得更复杂,有时误导
  4. 您可以比更新和重新编译代码更容易使用属性来修改或覆盖。
  5. ProfileCondition(因为@Profile上的元注释)不是SpringBootCondition,您无法使用/autoconfig来确定它是否已激活。
  6. 底线:定义properties的个人资料,而不是@Configuration@Bean的个人资料。

    如果您真的想要为生产代码排除测试内容,请查看spring-boot-devtools的文档,如果您使用Maven,则可以将所有测试类/资源放在单独的模块中,并标记其作为<optional>true</optional>或为其定义maven配置文件。请注意,同时使用maven配置文件和弹簧引导配置文件可能会造成混淆!