前言

随着互联网越来越流行,springboot已经成为我们无论是工作,还是面试当中,不得不掌握的技术。说起springboot笔者认为最重要的功能非自动配置莫属了,为什么这么说?如果参与过以前spring复杂项目的朋友肯定有过这样的经历,每次需要一个新功能,比如事务、AOP等,需要大量的配置,需要导出找jar包,时不时会出现jar兼容性问题,可以说苦不堪言。

springboot的出现得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集成),这是基于Spring 4.x以上的版本提供的按条件配置Bean的能力。有了springboot的自动配置的功能,我们可以快速的开始一个项目。

一、什么是自动配置

不知道朋友们在工作当中有没有这样的经历:

1.1 引入redisTemplate

只要我们在pom.xml文件中引入spring-boot-starter-data-redis-xxx.jar包,然后只要在配置文件中配置redis连接,如:

spring.redis.database = 0
spring.redis.timeout = 10000
spring.redis.host = 10.72.16.9
spring.redis.port = 6379
spring.redis.pattern = 1

就可以在service方法中直接注入StringRedisTemplate对象的实例,可以直接使用了。朋友们有没有想过这是为什么?

@Autowired
private StringRedisTemplate stringRedisTemplate;

1.2 引入transactionTemplate

在项目中只要引入spring-boot-starter-xxx.jar,事务就自动生效了,并且可以直接在service方法中直接注入TransactionTemplate,用它开发编程式事务代码。是不是很神奇?这又是为什么?

1.3 使用@ConfigurationProperties

使用@ConfigurationProperties可以把指定路径下的属性,直接注入到实体对象中,看看下面这个例子:

@Data
@Component
@ConfigurationProperties("jump.threadpool")
public class ThreadPoolProperties {private int corePoolSize;private int maxPoolSize;private int keepAliveSeconds;private int queueCapacity;
}

只要application.properties这样配置,就可以自动注入到上面的实体中

jump.threadpool.corePoolSize=8
jump.threadpool.maxPoolSize=16
jump.threadpool.keepAliveSeconds=10
jump.threadpool.queueCapacity=100

没错,这三个例子都是springboot自动配置在起作用,我们分为两种情况:bean的自动配置 和 属性的自动配置。

二、工作原理

2.1 bean的自动配置

Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。我们先看看@SpringBootApplication注解:

它上面定义了另外一个注解:@EnableAutoConfiguration

该注解的关键功能由 @Import 提供,其导入的 AutoConfigurationImportSelector 的 selectImports() 方法通过 SpringFactoriesLoader.loadFactoryNames() 扫描所有具有 META-INF/spring.factories 的jar包下面 key 是 EnableAutoConfiguration 全名的,所有自动配置类。
我们看看 springboot 的 spring-boot-autoconfigure-xxx.jar

该jar包里面就有META-INF/spring.factories文件。

这个spring.factories文件是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔。
@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

SpringApplication.run(…)方法怎么调到selectImports()方法的
加载过程大概是这样的:
SpringApplication.run(…)方法 》
AbstractApplicationContext.refresh()方法 》
invokeBeanFactoryPostProcessors(…)方法 》
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(…) 方法 》
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(…)方法 》
AutoConfigurationImportSelector.selectImports
该方法会找到自动配置的类,并给打了@Bean注解的方法创建对象。
postProcessBeanDefinitionRegistry方法是最核心的方法,它负责解析@Configuration、@Import、@ImportSource、@Component、@ComponentScan、@Bean等,完成bean的自动配置功能。
回到刚刚第二个例子TransactionTemplate为什么可以直接引用?
是因为在spring-boot-autoconfigure-xxx.jar的spring.factories配置文件中,EnableAutoConfiguration全类名下配置了TransactionAutoConfiguration全类名,springboot在启动的时候会加载这个类。


而TransactionAutoConfiguration类是一个配置类,它里面创建TransactionTemplate类的实例。

这样在其他地方就可以直接注入TransactionTemplate类的实例。

2.2 属性的自动配置

属性的自动配置是通过ConfigurationPropertiesBindingPostProcessor类的postProcessBeforeInitialization方法完成

public Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {ConfigurationProperties annotation = getAnnotation(bean, beanName,ConfigurationProperties.class);if (annotation != null) {bind(bean, beanName, annotation);}return bean;
}

它会解析@ConfigurationProperties注解上的属性,将配置文件中对应key的值绑定到属性上。

三、自动配置的生效条件

每个xxxxAutoConfiguration类上都可以定义一些生效条件,这些条件基本都是从@Conditional派生出来的。

常用的条件如下:

@ConditionalOnBean:当容器里有指定的bean时生效
@ConditionalOnMissingBean:当容器里不存在指定bean时生效
@ConditionalOnClass:当类路径下有指定类时生效
@ConditionalOnMissingClass:当类路径下不存在指定类时生效
@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。

举个比较常用的例子看看TransactionAutoConfiguration,是如何使用条件的

我们可以看到,条件用的是:@ConditionalOnClass,表示TransactionAutoConfiguration类只有在PlatformTransactionManager类存在时才会生效。

总结

本篇文章从什么是自动配置,工作原理 和 自动配置的生效条件 三个方面介绍了自动配置的相关知识点。自动配置又分为:bean的自动配置 和 属性的自动配置,二者的实现原理不一样。自动配置的生效条件用得非常多,建议朋友们好好研究一下。

Springboot面试杀手锏-自动配置原理相关推荐

  1. SpringBoot面试杀手锏——自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/u014745069/ article/details/83820511 引言 不论在工作中,亦或 ...

  2. Spring Boot 面试杀手锏—自动配置原理

    点击关注公众号,回复"1024"获取2TB学习资源! 引言 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观 ...

  3. Spring Boot面试杀手锏————自动配置原理

    引言 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框 ...

  4. SpringBoot SimpleCacheConfiguration的自动配置原理

    引言   在之前的博客中分享了简单的SpringBoot缓存的HelloWorld程序,在篇博客中主要来分析一下SpringBoot对于缓存自动配置的原理 缓存自动配置原理   首先在SpringBo ...

  5. 【springboot】之自动配置原理

    使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置.那么springboot是怎么做到的呢?这篇文章将一步 ...

  6. Spring Boot 面试杀手锏:自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如 ...

  7. 【详解】面试必问:SpringBoot自动配置原理

    前言 SpringBoot框架是开发中的一大利器,其简化了spring的xml的配置,遵循了"约定大于配置"的原则,使用注解对常用的配置做默认配置,减少使用xml配置模式.Spri ...

  8. 这样讲 SpringBoot 自动配置原理,你应该能明白了吧

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:你在我家门口 juejin.im/post/5ce5effb ...

  9. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

最新文章

  1. 1 搭建MyBatis环境
  2. python fork 守护进程
  3. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?
  4. C++this指针的用法
  5. Nmap源码分析(整体架构)
  6. leetcode 303 python(动态规划)
  7. php音频转换接口,PHP实现chrome表单请求数据转换为接口使用的json数据
  8. 安卓程序运行后控件不显示_智能镜子显示屏掀起了智能家居行业的新潮流
  9. Golang的聊天服务器实践(群聊,广播)(一)
  10. Spring底层核心原理解析
  11. 环形电流计算公式_辨析!环形差模电感饱和电流的计算公式是什么?
  12. 难分伯仲,驱动人生驱动精灵巅峰评测?
  13. Revit二次开发 —— 点到面的投影
  14. 计算机怎么看事件管理,用事件查看器查看电脑使用记录
  15. 【Android -- 技术周刊】第 020 期
  16. 自定义 Drawable实现灵动红鲤鱼特效
  17. WIN7 启动屏幕键盘
  18. 关于百度题库题目答案遮挡的问题的解决方法
  19. 解决了计算机处理汉字的问题,计算机处理汉字必须解决的三个问题分别是汉字...
  20. python爬取分析超级大乐透开奖数据

热门文章

  1. 腾讯优图TFace正式开源,更可信的人脸识别!
  2. 人像姿势,从细节做起!
  3. https://download.csdn.net/download/dsj27/7105355
  4. javaweb-一个投票网页
  5. Kafka SASL配置 Demo测试
  6. C++设计一个长方形类
  7. python调用pandas保存excel
  8. Java-常用实现分页查询
  9. 快速学习Groovy
  10. 数独游戏-安卓版源代码和分析。