Spring Boot自定义配置
一、方法
覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式 不限, Spring支持的XML和Groovy形式配置都可以。
二、原理
@ConditionalOnMissingBean注解是覆盖自动配置的关键。 Spring Boot的设计是加载应用级配置,随后再考虑自动配置类。 关于Spring Security,自动配置会考虑几个配置类 其中最重要的一个类是SpringBootWebSecurityConfiguration。
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({ EnableWebSecurity.class })
@ConditionalOnMissingBean(WebSecurityConfiguration.class)
@ConditionalOnWebApplication
public class SpringBootWebSecurityConfiguration {
...
}
这里@ConditionalOnClass注解表示必须要有@EnableWebSecurity注解。 @ConditionalOnWebApplication 表示必须是个Web应用程序。 @ConditionalOnMissingBean注解要求当下没有WebSecurityConfiguration类型的Bean。
所以覆盖Spring Security的自动配置,可以写一个类:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ReaderRepository readerRepository;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").access("hasRole('READER')")
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=true");
}
@Override
protected void configure(
AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
return readerRepository.findOne(username);
}
});
}
}
虽然表面上我们并没有这么一个Bean,但通过在SecurityConfig上添加@EnableWebSecurity注解, 我们实际上间接创建了一个WebSecurityConfiguration Bean。所以在自动配置时, 这个Bean就已经存在了, @ConditionalOnMissingBean条件不成立, SpringBootWebSecurityConfiguration提供的配置就被跳过了。
三、简单方案——通过属性文件外置配置
全部外置配置(优先级从高到低):
- (1) 命令行参数
- (2) java:comp/env里的JNDI属性
- (3) JVM系统属性
- (4) 操作系统环境变量
- (5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random. long})
- (6) 应用程序以外的application.properties或者appliaction.yml文件
- (7) 打包在应用程序内的application.properties或者appliaction.yml文件
- (8) 通过@PropertySource标注的属性源
- (9) 默认属性
常用的外置配置:
- xml(@ImportResource(a.xml,b.xml))
- 命令行参数(java -jar x.jar --server.port=8000)
- properties文件/yaml文件(可以结合@ConfigurationProperties注解使用: @ConfigurationProperties(prefix="aa",locations="a.properties"))
application.properties和application.yml文件能放在以下四个位置 (优先级从高到低,同一优先级位置yml文件优先级高于properties文件)。
- (1) 外置,在相对于应用程序运行目录的/config子目录里。
- (2) 外置,在应用程序运行的目录里。
- (3) 内置,在config包内。
- (4) 内置,在Classpath根目录。
本博客文章皆出于学习目的,个人总结或摘抄整理自网络。引用参考部分在文章中都有原文链接,如疏忽未给出请联系本人。另外,作为一名菜鸟程序媛,如文章内容有错误,欢迎点击博客右上方的扣扣链接指导交流。