我有一个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
都不是一个好主意。这就是为什么我认为你必须避免在代码中使用它:
- 你总是可以定义像
my.feature-for-the-profile.enabled
这样的属性,通过使用profile来实现相同的目标。 - 配置文件有时会出现分歧,保留每一个不断变化的配置,因为属性可以让你在任何地方都能更好地控制一切。 Spring Boot有一个定义良好的特定于配置文件的外部化属性支持(如application-
- 与更新和重新编译代码相比,使用属性修改或覆盖代码更容易。
-
ProfileCondition
(作为@Profile
的元注释)不是SpringBootCondition
,您不能使用/autoconfig
来确定它是否激活。
prod
.yml)。在你的代码库中加入配置文件会让事情变得更复杂,有时还会让人产生误解。底线:为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是否提供了一种更清晰的方式来组织配置文件?
我不知道,除了上面链接的方法