@Profile 与 @ConditionalOnProperty
Posted
技术标签:
【中文标题】@Profile 与 @ConditionalOnProperty【英文标题】:@Profile vs @ConditionalOnProperty 【发布时间】:2017-10-19 16:49:58 【问题描述】:最近我被要求创建一个新的profile
来(取消)激活一项功能。我有两种情况需要进行更改:
class A
public void configure(AuthenticationManagerBuilder auth) throws Exception
SecurityConfigurer ldapConfigurer = securityFactory.ldapAuthenticationProviderConfigurer();
ldapConfigurer.configure(auth);
SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer();
offlineConfigurer.configure(auth);
在上面的类中,如果配置文件处于活动状态,则不必执行最后两行。我扩展了课程并将其分配给新的配置文件@Profile("notOffline")
,并在原来的课程中添加了@Profile("!notOffline")
。
class A
public void configure(AuthenticationManagerBuilder auth) throws Exception
SecurityConfigurer ldapConfigurer = securityFactory.ldapAuthenticationProviderConfigurer();
ldapConfigurer.configure(auth);
SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer();
offlineConfigurer.configure(auth);
class B extends A
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception
super();
SecurityConfigurer offlineConfigurer = securityFactory.offlineAuthenticationProviderConfigurer();
offlineConfigurer.configure(auth);
我要重构的第二个地方是这样的:
class C
public Something foo()
code();
code();
code();
thisLineHasNotToBeExecuted();
code();
code();
return something;
不必执行的行取决于方法其余部分使用的变量,而不是返回的内容。对于这种情况,我之前采用的方法并不令人满意(并且有两种方法正在调用此方法,但不必执行)。
一段时间后,我意识到更好的方法是在最后一个用@Value
注释的类中添加一个属性,然后在启动时将参数传递给tomcat。这样我就可以在thisLineHasNotToBeExecuted()
里面有一个if
,我可以在class A
和它的孩子上使用@ConditionalOnProperty
。
我的方法正确吗?
更多信息:当我们使用 ActiveDirectory 时,我正在(取消)激活故障转移身份验证,而在第二类中,我正在阻止将用户信息保存在缓存中。
谢谢!
【问题讨论】:
【参考方案1】:您在第一种情况下使用配置文件是合适的。
'@ConditionalOnProperty' 不是处理第二个用例的正确方法。它通常用于 Spring Boot Starter 项目的启动配置。
您使用属性并添加“if”来决定是否执行 'thisLineHasNotToBeExecuted();' 的想法是在正确的轨道上。如果该行的执行取决于配置文件,那么您可以将活动配置文件注入到类中并关闭该值。如果您使用的是 Spring Boot 配置服务器,请务必添加“@RefreshScope”。
【讨论】:
以上是关于@Profile 与 @ConditionalOnProperty的主要内容,如果未能解决你的问题,请参考以下文章