本文转载自微信公众号「七哥聊编程」,何覆作者七哥。盖自转载本文请联系七哥聊编程公众号。动配 本文提供完整代码示例,何覆详见 https://gitee.com/isevenluo/spring-road/ 的盖自 spring-road03 目录。 众所周知,动配Spring Boot 提供一个牛逼哄哄的何覆特性,帮助我们少写了很多模板化的盖自配置代码,这个特性就是动配:自动配置。 比如 Spring Data JPA,何覆Spring Security 只要引入相关的盖自依赖包,就会帮助我们自动配置好数据源 Bean 和 安全设置相关的动配 Bean,不用我们自己写配置就实现了相应的何覆功能。 但是盖自具体应用中,我们的动配实际情况往往都是比较复杂的,仅仅通过 Spring 自动配置是不能满足我们的需求的。就拿安全配置来说,在 Classpath 添加 Spring Security 后,默认为我们应用程序提供的安全设施是网站模板比较基础且粗暴的。我们在 Web 中访问应用程序,就会看到如下类似的身份验证对话框: 此处的用户名是 user,密码就比较蛋疼了,在应用每次启动时随机生成写入到日志里面了: Spring Security 自动配置生成的密码 虽然我们的应用已经算是一个安全的 Web 应用程序了,但是也有如下显著缺点: 那如何调整自动配置让 Spring 按照我们的需要进行配置呢?别着急,我们接着往下看。 一般我们覆盖 Spring Boot 默认自动配置的方式有两种:自定义配置Bean、修改外置属性进行配置。 覆盖自动配置的第一种方法呀,就是我们当自动配置不存在,自己手动配置对应的 Spring Bean。配置方式可以选择 XML,也可以用 Java 形式的源码下载配置。 今天七哥就选择目前更加流行的 Java 形式的配置,来演示一下如何覆盖我们上面所描述的自动配置的 Spring Security。 我们所要做的很简单,那就是写一个扩展类。 上面的代码中的 SecurityConfig 是个非常基础的 Spring Security 配置,有了它我们的 Spring Boot 应用程序就跳过了安全自动配置,不再使用默认的用户名和密码,而是使用我们定义的用户和密码来鉴权。 当然上面的代码展示的不全,但是剩下的类都不是重点,我还定义了一个 Viewer 类,实现了 UserDetails 类(Spring Security 中的用户接口),香港云服务器还有一个 Spring Data JPA 仓库接口,用来保存用户信息。详细的代码,都已经上传到开源仓库了,有需要的小伙伴自取哦 ~ ??? 这里我们再次强调一遍:想要覆盖 Spring Boot 的自动配置,我们只需要写一个显式的配置,这样 Spring Boot 就会发现我们的配置,然后就会降低自动配置的优先级,以我们自己写的为准。 这种配置属性文件的方式,相比于上面这种自定义 Bean 配置要简单很多。比如假设我们仅仅要 调整一个数据库的 URL、Spring Security 的默认用户名、应用日志的级别,如果都像上面那样覆盖自动配置,自己完整的声明一个 Bean,这就有点傻了!毕竟配置一个属性要比完整写一个 Bean 的配置要简单的多。 那如何配置属性呢? Spring Boot 应用程序支持的配置源有很多,比如说环境变量、命令行参数,当然最常见的还是属性文件里配置。 接下来给大家演示几个很常见的例子。 添加属性前: 在属性文件 application.properties 中添加属性 spring.main.banner-mode=off 后: 结果已经打开在控制台了,启动时的 Banner 已经不见了。 Spring Boot 默认使用 Logback来记录日志,并且用 INFO 级别输出到控制台。Logback一般情况下能很好的满足我们的需要,但是这里为了演示,假如我们要使用 Log4j2 替换默认的 Logback实现,需要怎么配置呢? 以 Gradle 为例,我们只需要修改起步依赖,在构建说明文件中引入对应的日志实现然后排除掉 Logback。 上面我们排除掉默认的日志依赖后,就可以引入我们需要的 Log4j2 日志依赖。 接下来如果还需要做一个常规的操作:修改日志级别和指定日志输出的文件。 当然我们以往的做法就是自己添加一个 log4j2.xml 文件,用来配置日志相关的信息,虽然这样可以让我们完全掌握应用程序的日志配置,但是仅仅修改日志级别和日志输出的文件则可以完全不用创建 log4j2.xml 文件,使用属性配置就可以实现。 我们在 Spring Boot 应用程序的 application.properties 文件中加入 logging 开头的属性就可以满足我们期望。 至此,说明了通过上面的属性配置也实现了我们对于 Spring Boot 应用程序自动配置的微调。 今天我们介绍了两种覆盖 Spring Boot 自动配置的方法。 第一种就是自定义配置 Bean,实现原理是通过 Spring 的条件化配置,这块有一个非常重要的注解就是 @ConditionalOnMissingBean ,意思是如果我们的 classpath 中没有发现相应类型的 Bean,Spring Boot 才会帮我们自动配置一个。Spring Boot 的设计是优先加载我们应用里面配置的类,然后在考虑自动配置类。 第二种就是通过配置属性来调整 Spring Boot 自动配置,实现原理就是设定不同属性源里配置的属性优先级不同,而我们应用程序属性文件中添加的属性配置优先级高于默认属性,所以实现了调整自动配置的目的。 今天就先聊到这里,更多关于 Spring 相关的内容,也在持续更新中,敬请关注!1. 缘起
2. 自定义配置Bean覆盖自动配置
3. 通过配置属性来调整自动配置
4. 总结