SpringBoot的自动配置
一、BB两句
很多人都用过SSM和SpringBoot,两者对比起来,SpringBoot用起来更方便,因为它简化了很多配置。为什么在SpringBoot中可以省略那么多配置呢?我们能脱口而出因为SpringBoot遵循约定大于配置,框架帮我们做了很多默认配置。但是SpringBoot框架具体是怎么做到默认配置的。我觉得愿意去思考这个问题已经说明在成长了。
不过很显然,搞懂这块知识并不是一件简单的事情。这里记录下学习过程中的一些笔记,方便自己后续学习。如果大家要学习,建议看文末的参考文章。
二、笔记摘要
springboot相比ssm有两点改进,第一点是减少配置文件的配置,第二点是通过pom简化了依赖的jar包的配置。
这里要讲的是第一点:为什么可以不用写这些配置文件?SpringBoot是怎么帮我们做了这些事情的呢?
SpringBoot使用的是一种约定策略,也就是自动配置策略。它默认帮我们配置了一些信息。如果我们自己有额外的配置,则默认的配置信息就不生效。
它是基于java代码的bean配置。其中关键是用到这几个注解:
@Configuration
@Bean
这两个注解一起使用,就可以实现基于java代码的bean配置。
@Configuration注解的类可以看做是能生成Spring IOC管理的Bean实例的工厂。
@Bean注解是告诉Spring,一个带有@Bean注解的方法将返回一个对象,该对象应该被注册到Spring容器中。
传统的xml的bean配置方法如下:
<beans>
<bean id = "car" class="com.itpsc.Car">
<property name="wheel" ref = "wheel"></property>
</bean>
<bean id = "wheel" class="com.itpsc.Wheel"></bean>
</beans>
它等价于下面的java代码的配置方式:
@Configuration
public class Conf {
@Bean
public Car car() {
Car car = new Car();
car.setWheel(wheel());
return car;
}
@Bean
public Wheel wheel() {
return new Wheel();
}
}
我们在springboot中使用mybatis时,不需要去配置SqlSessionFactory和Datasource、TransactionManger这些东西。正是因为springboot采用了这种自动配置策略。
在我们引入mybatis-spring-boot-starter依赖时,这个包会帮我们引入一个mybatis-spring-boot-autoconfigure包。这个包下有个类叫做MyBatisAutoConfiguration类。它被@Configuration注解修饰,并且它的返回都被@Bean注解修饰。
因此,这个就是一个自动配置类。通过它,实现了mybatis相关依赖类的自动配置。
那bean参数是怎么获取的呢?像DataSource数据源的配置参数是怎么获取的呢?这就用到@EnableConfigurationProperties注解。
对于DataSource数据源,它的自动配置类是DataSourceAutoConfiguration类,在这个类上,用到了@EnableConfigurationProperties注解,其中参数是DataSourceProperties.class。
而在这个DataSourceProperties类中,有DataSource数据源的各种参数,并且有个注解@ConfigurationProperties(prefix=“spring.datasource”),它指明了配置文件的前缀。
这里涉及到两个容易混淆的注解:
@EnableConfigurationProperties
@ConfigurationProperties
@ConfigurationProperties注解的作用是把yml或者properties配置文件转化为bean。
@EnableConfigurationProperties注解的作用是使@ConfigurationProperties注解生效。如果只配置@ConfigurationProperties注解,在spring容器中是获取不到yml或者properties配置文件转化的bean的。
那么参数呢??默认参数呢??以及如何识别自定义的参数???配置文件呢????????????????????????????????????????????????????????
另外,SpringBoot默认是扫描启动类所在的包下的主类与子类与子类的所有组件,并没有扫描依赖包中的类,那么依赖中的包的bean是如何别发现和加载的呢?通过这个注解:
@EnableAutoConfiguration
@EnableAutoConfiguration注解中引入了@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})这两个注解。
@AutoConfigurationPackage是用来加载启动类下的包下的类注册到SpringIoC容器中,
Import({AutoConfigurationImportSelector.class})是用来加载外部jar包中符合自动配置条件的bean注册到SpringIoC容器中。
@EnableAutoConfiguration就类似于@EnableScheduling注解,都是通过@Import将相关的bean加载到IoC容器中。
@EnableAutoConfiguration注解的作用就是通过@Import注解将符合自动配置条件的bean定义加载到IoC容器中。
例如我们添加了spring-boot-starter-web依赖,这个web模块会自动添加Tomcat和SpringMVC的依赖,在@EnableAutoConfiguration注解的作用下,SpringBoot会自动对Tomcat和SpringMVC进行自动配置。这就是自动配置。
总结@EnableAutoConfiguration的作用:
从classpath中搜索所有META-INF/spring.factories配置文件后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项根据条件确定是否要加载到spring容器中。
看这里看这里!!!!!!!!!!!!!!!!!!!!!
这篇文章是我想看的:https://www.jianshu.com/p/5cb57be5d0ea
这句话:在spring容器启动时,会调用到AutoConfigurationImportSelector#getAutoConfigurationEntry
其实就是我还得去看SpringBoot启动的流程。启动的过程中就会去调用这些跟@EnableAutoConfiguration有关的方法,就会自动会装装载各个自动配置类。
三、参考文章
Spring Boot @EnableAutoConfiguration解析(推荐):https://www.jianshu.com/p/5cb57be5d0ea
@EnableAutoConfiguration自动配置原理分析:https://www.cnblogs.com/NinWoo/p/11300428.html
深入springboot原理——一步步分析springboot启动机制(starter机制):https://www.cnblogs.com/chongaizhen/p/11151892.html
spring boot启动原理:https://www.cnblogs.com/xiaopotian/p/11052917.html