springboot面试杀手锏

Easter79
• 阅读 497

前言

       随着互联网越来越流行,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

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

@Autowired

1.2  引入transactionTemplate

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

1.3  使用@ConfigurationProperties

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

@Data

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

jump.threadpool.corePoolSize=8

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

二 工作原理


2.1 bean的自动配置

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

我们先看看@SpringBootApplication注解

springboot面试杀手锏

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

springboot面试杀手锏

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

我们看看springboot的spring-boot-autoconfigure-xxx.jar

springboot面试杀手锏

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

springboot面试杀手锏

这个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在启动的时候会加载这个类。

springboot面试杀手锏

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

springboot面试杀手锏

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

2.2 属性的自动配置

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

public Object postProcessBeforeInitialization(Object bean, String beanName)

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

三 自动配置的生效条件

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

常用的条件如下:

@ConditionalOnBean:当容器里有指定的bean时生效

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

springboot面试杀手锏

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

如何自定义自动配置类?

请阅读《 老司机手把手教你编写自己的springboot starter》里面有详细步骤。

总结

本篇文章从什么是自动配置,工作原理 和 自动配置的生效条件 三个方面介绍了自动配置的相关知识点。自动配置又分为:bean的自动配置 和 属性的自动配置,二者的实现原理不一样。自动配置的生效条件用得非常多,建议朋友们好好研究一下。至于如何自定义自动配置类,本篇没有讲,是因为我在另外一篇文章《老司机手把手教你编写自己的springboot starter》中仔细介绍过的,有需要的朋友可以自行查阅。

如果这篇文档对您有所帮助的话,麻烦关注一下我的公众账号:苏三说技术,或者帮忙点赞或转发,坚持原创不易,您的支持是我坚持最大的动力。后面我会分享更多更实用的干货,谢谢大家的支持。

springboot面试杀手锏

本文分享自微信公众号 - 苏三说技术(gh_9f551dfec941)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Easter79 Easter79
2年前
springboot整合mybatis+oracle
第一步认识springboot:springboot是为了解决配置文件多,各个组件不统一的问题,它省去了很多配置文件,同时实现了spring产品的整合。创建springboot项目:通过选择springinit初始化springboot,我们发现它的pom.xml拥有绝大部分的spring所需要的包。第二步_打开项目的结构,
Stella981 Stella981
2年前
Spring Boot 支持 HTTPS 如此简单,So easy!
这里讲的是SpringBoot内嵌式Server打jar包运行的方式,打WAR包部署的就不存在要SpringBoot支持HTTPS了,需要去外部对应的Server配置。你所需具备的基础什么是SpringBoot?(https://www.oschina.net/action/GoToL
Wesley13 Wesley13
2年前
3 SpringBoot与微服务
SpringBoot的使用?化繁为简:SpringMVC需要定义各种配置,配置文件多。SpringBoot的核心功能?  独立运行:javajarXXX.jar(以前启动SPringMVC需要有服务器,比如tomcat)  内嵌web服务器:内嵌Tomcat.  简化配置:用starter
Stella981 Stella981
2年前
Spring Boot 面试,一个问题就干趴下了!
前言随着SpringBoot使用越来越广泛,SpringBoot已经成为Java程序员面试的知识点,很多同学对SpringBoot理解不是那么深刻,经常就会被几个连环跑给干趴下了!比如下面这一段的SpringBoot问答:问:你觉得SpringBoot最大的优势是什么呢?答:SpringBoot的最大
Stella981 Stella981
2年前
Spring Boot 面试总结(一)
1、使用SpringBoot 前景?多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应用程序服务器,添加sp
可莉 可莉
2年前
2019阿里P7最新总结Spring Boot面试问题
SpringBoot一直是Spring生态系统的关键参与者。该项目通过其自动配置功能使我们的生活更加轻松。在本教程中,我们将介绍在求职面试中可能出现的一些与SpringBoot相关的最常见问题。Spring和SpringBoot有什么区别?SpringFramework提供了多种功能,使Web
Stella981 Stella981
2年前
2019阿里P7最新总结Spring Boot面试问题
SpringBoot一直是Spring生态系统的关键参与者。该项目通过其自动配置功能使我们的生活更加轻松。在本教程中,我们将介绍在求职面试中可能出现的一些与SpringBoot相关的最常见问题。Spring和SpringBoot有什么区别?SpringFramework提供了多种功能,使Web
Stella981 Stella981
2年前
Spring Boot 静态资源处理
SpringBoot默认为我们提供了静态资源处理,使用WebMvcAutoConfiguration中的配置各种属性。建议大家使用SpringBoot的默认配置方式,如果需要特殊处理的再通过配置进行修改。如果想要自己完全控制WebMVC,就需要在@Configuration注解的配置类上增加@EnableWebMvc(@SpringBoot
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k