我有一个暴露休息服务的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;
}
}
我的问题是:
THX。
答案 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都不是一个好主意。这就是为什么我认为你必须避免在代码中使用它:
my.feature-for-the-profile.enable
等属性,以达到相同的目标。ProfileCondition
(因为@Profile
上的元注释)不是SpringBootCondition
,您无法使用/autoconfig
来确定它是否已激活。底线:定义properties
的个人资料,而不是@Configuration
和@Bean
的个人资料。
如果您真的想要为生产代码排除测试内容,请查看spring-boot-devtools的文档,如果您使用Maven,则可以将所有测试类/资源放在单独的模块中,并标记其作为<optional>true</optional>
或为其定义maven配置文件。请注意,同时使用maven配置文件和弹簧引导配置文件可能会造成混淆!