SSM与SpringBoot
1 SpringBoot自动装配详解
SpringBoot启动类
@SpringBootApplication注解
SpringBoot启动类=>@SpringBootApplication
@EnableAutoConfiguration注解
SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration
通过@EnableAutoConfiguration注解实现自动装配
@SpringBootApplication=>@EnableAutoConfiguration=>@AutoConfigurationPackage
通过@AutoConfigurationPackage注解将添加该注解的类所在的package作为自动配置package进行管理
通过AutoConfigurationPackages工具类获取自动配置package列表,也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package
@EnableAutoConfiguration注解最重要的是AutoConfigurationImportSelector.class,将需要装配的类装配到IoC容器中
核心类分析
selectImport方法
AutoConfigurationImportSelector中的selectImport方法是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的配置类集合
selectImport方法=>getAutoConfigurationEntry方法
getAttributes方法:获取@EnableAutoConfiguration中的exclude、excludeName等
getCandidateConfigurations方法:获取所有自动装配的配置类,也就是读取spring.factories文件,后面会再次说明
removeDuplicates方法:去除重复的配置项
getExclusions方法:根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类
fireAutoConfigurationImportEvents方法:广播事件
最后根据多次过滤、判重返回配置类合集
getCandidateConfigurations方法
selectImport方法=>getAutoConfigurationEntry方法=>getCandidateConfigurations方法
通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration
,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值
总结:
通过注解 @SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配
AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
2
3
4
5
6
7
8
9
BeanNameAware:实现该接口的Bean能够在初始化时知道自己在BeanFactory中对应的名字。
BeanFactoryAware:实现该接口的Bean能够在初始化时知道自己所在的BeanFactory的名字。
Spring中的bean的生命周期主要包含四个阶段:实例化Bean --> Bean属性填充 --> 初始化Bean -->销毁Bean
首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化,实际上就是通过反射的方式创建出一个bean对象
Bean实例创建出来后,接着就是给这个Bean对象进行属性填充,也就是注入这个Bean依赖的其它bean对象
属性填充完成后,进行初始化Bean操作,初始化阶段又可以分为几个步骤:
执行Aware接口的方法
Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的些资源。如实现
BeanNameAware接口可以获取到BeanName,实现BeanFactoryAware接口可以获取到工厂对象BeanFactory等
执行BeanPostProcessor的前置处理方法postProcessBeforelnitialization(),对Bean进行一些自定义的前置处理
判断Bean是否实现了InitializingBean接口,如果实现了,将会执行lnitializingBean的afeterPropertiesSet()初始化方法;
执行用户自定义的初始化方法,如init-method等;
执行BeanPostProcessor的后置处理方法postProcessAfterinitialization()
初始化完成后,Bean就成功创建了,之后就可以使用这个Bean, 当Bean不再需要时,会进行销毁操作,
首先判断Bean是否实现了DestructionAwareBeanPostProcessor接口,如果实现了,则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法
其次会判断Bean是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法
最后判断这个Bean是否配置了dlestroy-method等自定义的销毁方法,如果有的话,则会自动调用其配置的销毁方法
10.
10 SpringMVC九大组件
11
12
13
14
15
5
6
7