SpringBoot的自动装配:
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。
SpringBoot所具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
对于spring框架,我们接触得比较多的应该是spring mvc、和spring。而spring的核心在于IOC(控制反转对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系)和DI(依赖注入IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
springboot框架是为了能够帮助使用spring框架的开发者快速高效的构建一个基于spirng框架以及spring生态体系的应用解决方案。它是对“约定优于配置”这个理念下的一个最佳实践。因此它是一个服务于框架的框架,服务的范围是简化配置文件。
在日常的开发过程中Spring Boot
自动装配的特性给我们开发减少了很多重复性的工作,具体时如果实现自动装配的呢?
启动类上的注解是@SpringBootApplication
然后里面除其他的基本注解就是有以下三个重要的注解:
-
@SpringBootConfiguration:java的配置类,
-
@EnableAutoConfiguration:这个注解表明启动自动装配,里面包含两个比较重要的注解@AutoConfigurationPackage和@Import。
-
@AutoConfigurationPackage此注解类似@ComponentScan扫描包,但扫描的是@MapperSacn、@Entity等第三方注解
-
@Import注解:里面导入了一个配置类AutoConfigurationImportSelector.class,实现类AutoConfigurationImportSelector实现ImportSelector有一个抽象方法selectImports,调用了getAutoConfigurationEntry方法,返回了String[]数组,就是需要去指定装配到IOC的类,调用getCandidateConfigurations()方法获取候选装载的类,找的是META-INF/spring.factories文件的配置,
- spring.factories文件是一组组的key=value的形式,包含了key为EnableAutoConfiguration的全类名,value是一个AutoConfiguration类名的列表,以逗号分隔。
-
对准备装载的类进行加工(按需加载)
-
会移除重复的配置,
-
移除排除的配置,
类似**@SpringBootApplication(exclude = RedisAutoConfiguration.class)**
-
再进行filter过滤配置,返回最终需要配置的对象
从META-INF/spring-autoconfigure-metadata.properties中加载自动装配的条件元数据,简单来说就是只有满足条件的Bean才能够进行装配
-
-
-
@ComponentScan:它的作用是扫描当前包及其子包,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中;(这也是为什么有时我们把启动类放错位置,而导致无法扫描到某些包的原因)
@indexed注解:
加速索引,整一个索引表,减少IO
@import注解
-
静态注入进去
-
导入类型实现importSelector接口,不会注入到容器里面 会将对应接口的方法的信息进行返回 ,可以自定义条件进行灵活的返回, 相比Import好
实现的抽象类selectImport方法:可以自定义去返回类型
主要的实现在getAutoConfigurationEntry方法里面
加载类名称
-
实现importBeanDefinitionRegister接口,自己去注册
在ImportBeanDefinitionRegistrar接口中,有一个registerBeanDefinitions()方法,通过该方法,我们可以向Spring容器中注册bean实例。
Spring官方在动态注册bean时,大部分套路其实是使用ImportBeanDefinitionRegistrar接口。
所有实现了该接口的类都会被ConfigurationClassPostProcessor处理,ConfigurationClassPostProcessor实现了BeanFactoryPostProcessor接口,所以ImportBeanDefinitionRegistrar中动态注册的bean是优先于依赖其的bean初始化的,也能被aop、validator等机制处理。