20200308 SpringBoot自动配置学习笔记1

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章