一、方法

覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式 不限, 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. CentOS 7常用工具安装

    git 在Linux下开发项目,少不了要使用git工具,安装方法十分简单,通过一条 yum 指令既可完成安装: yum install git 安装完成后检测版本: # git --version g ...

  2. React Native组件(三)Text组件解析

    相关文章 React Native探索系列 React Native组件系列 前言 此前介绍了最基本的View组件,接下来就是最常用的Text组件,对于Text组件的一些常用属性,这篇文章会给出简单的 ...

  3. c语言第4次作业

    题目7-2九九乘法表 1.代码: #include<stdio.h> int main() { int N, i, j, q; scanf("%d",&N); ...

  4. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  5. lx 与cd 的计算方法

    Candela to lux calculation with distance in meters The illuminance Ev in lux (lx) is equal to the lu ...

  6. [转](阿里笔试)使用多线程和sleep函数生成字符串的伪随机排列

    http://blog.csdn.net/jiaowopan/article/details/12009079 C/C++(Linux平台) 注意编译连接时需要链接pthread库,即g++ XX.c ...

  7. Uva12230Crossing Rivers (数学期望)

    问题: You live in a village but work in another village. You decided to follow the straight path betwe ...

  8. Cookie用法

    //写入 protected void Button1_Click(object sender, EventArgs e) { HttpCookie cookie=new HttpCookie(&qu ...

  9. WordCount运行详解

    1.MapReduce理论简介 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然 ...

  10. Java 合并.wav 文件

    package org.lib.speech.test;import java.io.*; import java.util.*;import javax.sound.sampled.AudioFil ...