SpringBoot实战之SpringBoot自动配置原理

SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @ConfigurationProperties 等几个注解来进行自动配置完成的。

@EnableAutoConfiguration 开启自动配置,主要作用就是调用 Spring-Core 包里的 loadFactoryNames(),将 autoconfig 包里的已经写好的自动配置加载进来。

@Conditional 条件注解,通过判断类路径下有没有相应配置的 jar 包来确定是否加载和自动配置这个类。

@EnableConfigurationProperties 的作用就是,给自动配置提供具体的配置参数,只需要写在 application.properties 中,就可以通过映射写入配置类的 POJO 属性中。

@EnableAutoConfiguration

@Enable*注释并不是SpringBoot新发明的注释,Spring 3框架就引入了这些注释,用这些注释替代XML配置文件。比如:
@EnableTransactionManagement注释,它能够声明事务管理
@EnableWebMvc注释,它能启用Spring MVC
@EnableScheduling注释,它可以初始化一个调度器。

这些注释事实上都是简单的配置,通过@Import注释导入

从启动类的@SpringBootApplication进入,在里面找到了@EnableAutoConfiguration,

1.png

2.png

@EnableAutoConfiguration里通过@Import导入了EnableAutoConfigurationImportSelector,

3.png

进入他的父类AutoConfigurationImportSelector

4.png

找到selectImports()方法,他调用了getCandidateConfigurations()方法,在这里,这个方法又调用了Spring Core包中的loadFactoryNames()方法。这个方法的作用是,会查询META-INF/spring.factories文件中包含的JAR文件。

5.png

当找到spring.factories文件后,SpringFactoriesLoader将查询配置文件命名的属性。

6.png

7.png

Jar文件在org.springframework.boot.autoconfigure的spring.factories

8.png

spring.factories内容如下(截取部分),在这个文件中,可以看到一系列Spring Boot自动配置的列表

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\

下面我们来看自动配置redis的细节,RedisAutoConfiguration:

RedisAutoConfiguration

redis.png

这个类进行了简单的Spring配置,声明了Redis所需典型Bean,和其它很多类一样,重度依赖于Spring Boot注释:
1)@ConditionOnClass激活一个配置,当类路径中存在这个类时才会配置该类
2)@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集。
3)@ConditionalOnMissingBean启用一个Bean定义,但必须是这个Bean之前未定义过才有效。
还可以使用@ AutoConfigureBefore注释、@AutoConfigureAfter注释来定义这些配置类的载入顺序。

着重了解@Conditional注释,Spring 4框架的新特性

此注释使得只有在特定条件满足时才启用一些配置。SrpingBoot的AutoConfig大量使用了@Conditional,它会根据运行环境来动态注入Bean。这里介绍一些@Conditional的使用和原理,并自定义@Conditional来自定义功能。

  • @Conditional是SpringFramework的功能,SpringBoot在它的基础上定义了
  • @ConditionalOnClass,@ConditionalOnProperty等一系列的注解来实现更丰富的内容。

具体几个@Conditon*注解的含义

@ConditionalOnBean

仅仅在当前上下文中存在某个对象时,才会实例化一个Bean

@ConditionalOnClass

某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类

@ConditionalOnExpression

当表达式为true的时候,才会实例化一个Bean

@ConditionalOnMissingBean

仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean,该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean,可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行

@ConditionalOnMissingClass

某个class类路径上不存在的时候,才会实例化一个Bean

@ConditionalOnNotWebApplication

不是web应用时,才会执行


2.Properties系列注释

@EnableConfigurationProperties
@ConfigurationProperties(prefix = "may")

在需要注入配置的类上加上这个注解,prefix的意思是,以该前缀打头的配置,以下是例子

    @ConfigurationProperties(prefix = "may")  public class User {  private String name;  private String gender;  //省略setter,getter方法}  

application.yml中的配置

   mayname: youjiegender: man

如果不用系统初始的application.yml配置类,而是使用自己的如youjie.yml,可以如下配置

    @ConfigurationProperties(prefix = "may",locations = "classpath:youjie.yml")  public class User2 {  private String name;  private String gender;  //省略setter,getter方法}

过时:由于Spring-boot 1.5.2版本移除了,locations这个属性,因此上述这种方式在最新的版本中过时。
@PropertySource

Spring-boot 1.5.2版本之后,采用下面这种方式

@Component
//@PropertySource只能加载.properties文件,需要将上面的yml文件,改为.properties文件
@PropertySource("classpath:may.properties")
@ConfigurationProperties(prefix="may") 
public class User2 {  private String name;  private String gender;  //省略setter,getter方法}  

@EnableConfigurationProperties

最后注意在spring Boot入口类加上@EnableConfigurationProperties

    @SpringBootApplication  @EnableConfigurationProperties({User.class,User2.class})  public class DemoApplication {  public static void main(String[] args) {  SpringApplication.run(DemoApplication.class, args);  }  }  

其实这里@EnableConfigurationProperties({User.class,User2.class}) 可以省略

config.png

总结

SpringBoot 的 自动配置得益于 SpringFramework 强大的支撑,框架早已有很多工具和注解可以自动装配 Bean 。SpringBoot 通过 一个封装,将市面上通用的组件直接写好了配置类。当我们程序去依赖了这些组件的 jar 包后,启动 SpringBoot应用,于是自动加载开始了。

我们也可以定义自己的自动装配组件,依赖之后,Spring直接可以加载我们定义的 starter 。笔者将在后续文章中进行编码和解读。



欢迎关注博主微信公众号,更多技术分享

1211217-20180925131518525-420767372.png

转载于:https://www.cnblogs.com/leihuazhe/p/7743479.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Install OpenCV-Python in Ubuntu

之前安装python版opencv,需要下载whl文件,进行安装,这是在window环境下的:安装opencv_python,下载whl包安装系统python下的opencv 今天发现一个简单的方法。Install OpenCV-Python in UbuntuInstall package python-opencv with f…

如何健康地跑步?

最近某司高管跑步 28 公里后猝死,被各大媒体报道,每次这种悲剧发生,而且还跟跑步扯上关系,总是让人心痛。通过报道了解到,这位高管酷爱跑马拉松,身体素质和运动能力肯定是强于普通人的,但还是遭…

项目共享协调机制

API,协调前端与后端开发的连接点。 面临几个问题 1. API更新不及时,导致前端开发的接口没有及时更新而出现各种问题。 2. 文档描述得不准确 3. 没有统一的标准。 我们可以使用swagger editor, swagger ui。第一是编辑器,第二个是展…

vs2008C1902程序数据库管理不匹配

大清早打开vs2008,出现这么诡异的错, 删了一个dll的就好了。如图

mysql user表 空_mysql 忘记密码,重置密码,mysql.user表为空的解决办法

一、用户表有用户,直接修改密码ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)修改mysql配置文件my.cnf:vim /etc/my.cnf在[mysqld]中添加skip-grant-tables重启mysql服务,用空密码直接登录,查…

链式封装与调用

var CheckObject function(){}; CheckObject.prototype function(){checkName:function(){// codereturn this;},checkEmail:function(){// code return this;},checkPassword:function(){// codereturn this;} } //使用 var Check new CheckObject() Check.checkName().che…

全新升级的AOP框架Dora.Interception[3]: 基于特性标注的拦截器注册方式

在Dora.Interception中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上。本篇文章介绍最常用的基于“特性标注”的拦截器注册方式,下一篇会介绍另一种基于(Lambda)表达式的注册方式:全新升级的AOP框架Dora.Interceptio…

在惨遭勒索病毒攻击之后,微软呼吁重新制定“数字日内瓦公约”

基于美国安全局泄露文档开发的病毒程序成为上周的主要新闻,该病毒导致全世界大量的Windows电脑瘫痪。WannaCry勒索病毒在150个国家有20万个受害者,包括英国的医院、西班牙的基础设施部门和俄罗斯的内政部。Renault在受到攻击之后关闭了几家在法国境内的工…

【代码审计】PHP代码审计---基础记录

PHP伪协议 PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种。 * file:// — 访问本地文件系统 * http:// — 访问 HTTP(s) 网址 * ftp:// — 访问 FTP(s) URLs * php:// — 访问各个输入/输出流(I/O streams) * zlib:// — 压…

全新升级的AOP框架Dora.Interception[4]: 基于表达式的拦截器注册

基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上,对于第三方提供的类型就无能为力了。对于Dora.Interception来说,拦截器注册本质上建立拦截器与一个或者多个目标方法之间的映射,所以最笨的方式就是利用反射的方式得到表示…

mysql8.0.12插件_MySQL8.0.12 安装及配置

MySQL8.0.12 安装及配置发布时间:2018-08-07 10:39,浏览次数:274, 标签:MySQL一.安装1.从网上下载MySQL8.0.12版本,下载地址:https://dev.mysql.com/downloads/mysql/2. 下载完成后解压我解压的路径是:D:\J…

python模块之hashlib

hashlib模块实现了多种安全哈希和信息摘要算法的通用接口,包括FIPS中定义的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定义的MD5 注意点:1. adler32及crc32哈希由zlib模块提供2. 某些算法已知存在哈希碰撞弱点 哈希算法 每个hash算法都有一个同…

记一次阿里电面经历

昨天下午(3/19)三点多钟,接到了一个杭州的电话,是阿里的。问我是否方便聊聊。我说我在上课,四点下课。然后他就四点多钟的时候又打了一次过来。项目经历上来就问我有无大型项目的经历。不好意思,我说无。。…

C语言程序设计第三次作业

(一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。 输入输出样例1:   Enterr x: 10.0   f(10.0) 0.1 输入输出样例2:   Enter x: 234   f(234.0…

mysql数据库项目化教程郑小蓉_MySQL数据库项目化教程(高等职业教育“十三五”规划教材(软件技术专业))...

《MySQL数据库项目化教程/高等职业教育十三五规划教材(软件技术专业)》是一本介绍MySQL数据库基础知识的入门教材,采用项目驱动方式循序渐进地介绍MySQL各个模块的知识。主要内容包括:Windows下MySQL的安装,MySQL服务的启动与停止&#xff0c…

WPF-09 ManualResetEventSlim信号量

业务场景如下:WPF应用程序后台有个定时任务在接收PLC硬件数据(该线程接收完数据之后, 会重新启动一个新线程继续接收.....),当应用程序关闭时, 我们得确保接收PLC硬件数据的线程完成之后,再关闭应用程序,否则会造成数据丢失。上面的业务场景是…

【bzoj3033】太鼓达人 DFS欧拉图

题目描述 给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。 输入 一个整数K。 输出 一个整数M和一个二进制串,由一个空格分隔…

Redis 集合处理

学习了列表之后,发现了Redis处理字符串的功能强大。 为了适应不同场景的需求,还有一个用的很多的就是集合。 Redis提供的集合支持的类型是字符串。并且集合中的元素值是唯一的,也就是说不能出现重复数据。 而且,集合的实现是通过哈…

fpga mysql_FPGA的一些琐碎知识整理

1.生产FPGA的厂家有:ALTERAXILINXATCELLatticeps:Altera和Xilinx主要生产一般用途FPGA,其主要产品采用SRAM工艺Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺ps: 熔丝,顾名思义:把丝熔掉,反…

使用增量备份修复DG中的GAP

问题描述 oracle中DG出现主备不同步现象,alert日志报警有gap信息,但是v$archive_gap视图查不到任何信息。同时主库上的对应归档已经删除且没有备份 解决方案 1.查询备库的scn SQL> select current_scn from v$database; 这时有可能出来的scn是以科学计…