Spring配置文件默认行为

时间:2017-04-06 10:56:55

标签: java spring spring-security

我有一个弹簧配置文件" DEV"这就是我唯一的个人资料,我不想创建一个"生产"轮廓。所以只有当个人资料是" DEV"我想启动某种类型的bean用于Spring安全性(这是一个内存来宾用户和一个userdetails bean)

但是如果我的tomcat启动中没有提供spring配置文件(生产中就是这种情况),我希望我的应用程序继续它已经在做的事情(使用ldap authenticatin提供程序)。

有没有办法定义"默认"没有实际需要在启动时提供配置文件的bean行为?或者您可以查看下面的代码并提出不同的解决方案。

@Autowired
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception {

        auth
                .eraseCredentials(false)
                .authenticationProvider(provider)
                .authenticationProvider(jwtConfig.jwtAuthenticationProvider());
}


@Bean
public UserDetailsService userDetailsService() {
    final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator());
    return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService));
}

@Bean
@Profile("DEV")
public UserDetailsService devUserDetailsService() {
 useAnonymous = true;
        InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder()
                .withUser("user").password("password").authorities(ROLE_USER, ROLE_ADMIN).and();

        return new CompositeUserDetailsService(Arrays.asList(b.build(),
                technicalUserDetailsService()));

}
@Bean
public AuthenticationProvider ldapAuthenticationProvider() {
    final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource());
    ba.setUserSearch(ldapUserSearch());
    return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator());
}

2 个答案:

答案 0 :(得分:6)

我认为对@Profile的作用存在误解。标记为@Profile的Bean仅在该配置文件处于活动状态时加载,但所有其他bean(没有@Profile)仍然始终加载,无论选择的配置文件如何。

我看到了解决这个问题的几种方法:

1)用@Profile("dev")标记所有那些带有@Primary的bean,这样Spring知道当加载两个相同类型的bean时要选择哪一个(因为你不想使用生产配置文件)

2)当使用@Profile("!dev")激活配置文件时,标记应该加载的bean - 仅适用于Spring 3.2及更高版本(请参阅https://github.com/spring-projects/spring-framework/commit/bcd44f3798ed06c0704d2a3564b8a9735e747e87)。< / p>

或者...

3)使用生产配置文件,然后在例如web.xml文件(您可能不在本地使用的文件)中激活它。

只需创建多个@Configuration类,并使用配置文件标记整个类(这也有助于将相关内容保存在一起)。典型的例子是数据库。为生产数据库(使用JNDI和Oracle)创建一个配置类,为本地开发和测试(HSQLDB)创建一个配置类。

您使用@Profile("production")标记JNDI配置类,使用@Profile("dev")标记另一个 - 不需要标记单个bean,只需在逻辑上将它们分成两个不同的@Configuration类。

这对我们来说非常有用,当与集成测试结合使用时也是如此。

答案 1 :(得分:0)

我会以这种方式覆盖bean定义:

@Qualifier

以这种方式启动“DEV”配置文件时,该配置文件中定义的bean应覆盖默认bean

当您自动装配bean时,您应该使用contextPath注释

我希望它有用

安吉洛