一、方法

覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式 不限, 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根目录。

Spring Boot自定义配置的更多相关文章

  1. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...

  2. 玩转Spring Boot 自定义配置、导入XML配置与外部化配置

    玩转Spring Boot 自定义配置.导入XML配置与外部化配置       在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...

  3. Spring Boot自定义配置实现IDE自动提示

    一.背景 官方提供的spring boot starter的配置项,我们用IDE配置的时候一般都有自动提示的,如下图所示 而我们自己自定义的配置却没有,对开发非常不友好容易打错配置,那这个是怎样实现的 ...

  4. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  5. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...

  6. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

  7. 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...

  8. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

  9. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

随机推荐

  1. Android版本的"Wannacry"文件加密病毒样本分析(附带锁机)

    一.前言 之前一个Wannacry病毒样本在PC端肆意了很久,就是RSA加密文件,勒索钱财.不给钱就删除.但是现在移动设备如此之多,就有一些不法分子想把这个病毒扩散到移动设备了,这几天一个哥们给了一个 ...

  2. Java8安装配置

    方法1.命令行安装 -jdk 存在多个版本,自动配置: sudo update-alternatives --config java 方法2.下载安装 下载java8的jdk http://www.o ...

  3. TCP 和 UDP 的区别( 面向连接 和 面向无连接 )

    第一:TCP 和 UDP 的区别( 面向连接 和 面向无连接 ) TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才 ...

  4. C++ 项目经验总结:程序严谨性(一)

    作者:JK 时间:2015/09/24 特别说明:版权所有,转载请注明出处: 最近笔者在参与项目时,遇到了一些很奇特的问题,程序运行正常,产生的结果异常,程序功能是对当天的数据进行统计,数据里有可能有 ...

  5. HDU - 6214:Smallest Minimum Cut(最小割边最小割)

    Consider a network G=(V,E) G=(V,E) with source s s and sink t t . An s-t cut is a partition of nodes ...

  6. 【转载】分布式之redis复习精讲

    注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...

  7. RSA 每次公钥加密不同结果

    今天服务器端一哥们突然跑过来跟我说:我发现公钥每次加密都不同结果啊? 我说:怎么可能?不同的话,私要怎么解密和验证啊? 然后我屁颠屁颠的试了下,结果发现不论在在线RSA的还是自己公司 利用同一个明文加 ...

  8. 异常处理过程和异常处理的执行顺序(针对try{}catch{}finally{}而言)

    1.异常的处理方式有两种分别为:try{}catch{}finally{}和throws下面简单说一下这两者的区别和联系. 2.出现异常之后如果没有进行捕获处理系统就会直接将这个异常栈的跟踪信息直接打 ...

  9. Ecel 粘贴图片并调整大小,移到底层

    Sub Click() ActiveSheet.Pictures.Paste.Select Selection.ShapeRange.ScaleWidth 1.4, msoTrueSelection. ...

  10. lapis http verb 处理

    1. 同一个url 包含不同的请求(respond_to  进行解决) // 路由格式 match ,通过respond_to 进行实际的http verb 处理 local lapis = requ ...