春天对方法的@Profile是一种好的做法吗



我有一个Spring Boot Web应用程序公开rest服务。

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

在prod模式下,我比在dev模式下有更多的过滤器要激活。

我的Filters配置类如下:

@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 .

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

  1. 你总是可以定义像my.feature-for-the-profile.enabled这样的属性,通过使用profile来实现相同的目标。
  2. 配置文件有时会出现分歧,保留每一个不断变化的配置,因为属性可以让你在任何地方都能更好地控制一切。
  3. Spring Boot有一个定义良好的特定于配置文件的外部化属性支持(如application- prod .yml)。在你的代码库中加入配置文件会让事情变得更复杂,有时还会让人产生误解。
  4. 与更新和重新编译代码相比,使用属性修改或覆盖代码更容易。
  5. ProfileCondition(作为@Profile的元注释)不是SpringBootCondition,您不能使用/autoconfig来确定它是否激活。

底线:为properties定义概要文件,而不是为@Configuration s或@Bean s定义概要文件。

如果你真的想在你的生产代码中排除测试的东西,看看spring-boot-devtools的文档,如果你使用Maven,你可以把所有的测试类/资源放在一个单独的模块中,并标记为<optional>true</optional>或为它定义Maven配置文件。注意,同时使用maven配置文件和spring引导配置文件可能会令人困惑!

我认为在不同的包中为不同的环境配置会更好。您不希望混淆配置。结构可能像这样:

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

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

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

是否有一种方法可以强制编译器排除用不同的配置文件注释的类,方法等?(我不希望我的生产jar/war被不必要的代码填充!)

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

的方法

根据我的经验,配置文件更容易

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

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

相关内容

最新更新