最近我被要求创建一个新的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条答案
按热度按时间d6kp6zgx1#
在第一种情况下使用概要文件是合适的。
@ConditionalOnProperty
不是处理第二个用例的正确方法,它通常用于Sping Boot Starter项目的启动配置。使用一个属性并添加一个
if
条件来决定是否执行thisLineHasNotToBeExecuted();
的想法是正确的。如果这一行的执行依赖于配置文件,那么您可以将活动的配置文件注入到类中并关闭该值。如果您使用的是spring Boot config服务器,那么请确保添加一个@RefreshScope
。