@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的主要内容,如果未能解决你的问题,请参考以下文章

利用Jenkins与profile管理自动集成中的配置文件

@Profile 与 @ConditionalOnProperty

ZHA profile与ZLL profile的一个例子

bashrc 与 profile

Spring 环境与profile——超简用例

[转] - bashrc与profile的区别