spring @Configuration 文件与@条件开属性

ntjbwcob  于 2022-12-17  发布在  Spring
关注(0)|答案(1)|浏览(224)

最近我被要求创建一个新的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时,我正在激活(取消激活)故障切换身份验证,而在第二类中,我正在阻止将用户信息保存该高速缓存中。
谢谢!

d6kp6zgx

d6kp6zgx1#

在第一种情况下使用概要文件是合适的。
@ConditionalOnProperty不是处理第二个用例的正确方法,它通常用于Sping Boot Starter项目的启动配置。
使用一个属性并添加一个if条件来决定是否执行thisLineHasNotToBeExecuted();的想法是正确的。如果这一行的执行依赖于配置文件,那么您可以将活动的配置文件注入到类中并关闭该值。如果您使用的是spring Boot config服务器,那么请确保添加一个@RefreshScope

相关问题