Spring Boot--02--自动装配原理

SpringBoot项目启动过程分析

Spring Boot--02--自动装配原理_第1张图片
找到项目的入口类(使用了@SpringBootApplication注解描述),然后运行启动类,检测启动过程,SpringBoot在启动时,控制台会出现上图标识:
Spring Boot--02--自动装配原理_第2张图片

  1. SpringBoot 项目在启动时,首先基于启动入口类上的(@SpringBootApplication)注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service 等)。
  2. 假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,
  3. 假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

Spring框架管理Bean对象的优势

Spring 是一个资源整合框架(Framework),通过spring可将很多资源(自己写的对象或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用,以便更好的对外提供服务。
Spring Boot--02--自动装配原理_第3张图片
懒加载策略 @Lazy(true) 默认为true
作用域 @Scope(“singleton”) 默认单例
生命周期方法 lifecycle method @PostConstruct @PreDestroy
Spring框架可以为由它管理的对象(Bean)提供懒加载策略(对象暂时用不到,则无需加载和实例化),作用域(例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。同时Spring框架还可以基于用户设计管理对象与对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。

Spring Boot--02--自动装配原理_第4张图片

Spring Boot--02--自动装配原理_第5张图片

Spring Boot--02--自动装配原理_第6张图片

@Autowired 注入 has a

Spring Boot--02--自动装配原理_第7张图片

@Autowired由spring框架定义,用于描述类中属性或相关方法。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。

什么是bean?

在Spring框架中由Spring创建和管理的对象的对象称之为Bean对象。
我们在java中,会把满足一定规范的java对象叫做bean对象。规范如下:
(1)必须是public的类
(2)必须具备无参数构造方法
(3)有公开的get set方法
(4)必须是可序列化(在序列化方式改进之后,这个规范不是必须的)

Serializable

:可序列化接口,是一个标识接口。
序列化的概念:把java对象拆分成一个一个的字节单元,便于存储到磁盘或者用于网络传输。
反序列化:就是把一个一个的字节单元读取回来,组成一个java对象。

在早期,Java要想实现序列化,只能通过java原生的序列化方式,也就是通过实现序列化接口来实现序列化。但是后来随着java的发展,衍生很多的第三方序列化jar包。

他们的序列化性能比原生的更好,而且不需要实现序列化也可以序列化。

SpringBoot特性: 开箱即用

引入少量(不引用)的配置,则可以实现项目的整合及使用.

1.元注解说明:

@Target(ElementType.TYPE) 对哪个元素有效 对类有效
@Retention(RetentionPolicy.RUNTIME) 什么时候起作用 运行期有效
@Documented 是否支持生成文档
@Inherited 该注解是否可以被继承.

2 SpringBootConfiguration说明

作用:标识主启动类是一个大型的配置文件,启动时会加载所有的小的配置文件.

@Configuration: 表示该类是一个配置类.
Spring Boot--02--自动装配原理_第8张图片

3 excludeFilters 说明

说明: 在springboot容器启动时,不需要加载某些过滤器.由于parent标签中定义了所有的关联的jar包文件信息.则启动时有可能导致意外的发生,所有需要提前剔除.
Spring Boot--02--自动装配原理_第9张图片

4 @AutoConfigurationPackage

说明: 当程序启动时,会根据主启动类的包路径,扫描其子孙包,所以springboot以后写代码时应该在其子孙包下编辑.
Spring Boot--02--自动装配原理_第10张图片

5 AutoConfigurationImportSelector

说明:该配置中内部集成了所有的SpringBoot中的选择器.这些选择器的主要的任务就是查看是否有自己选择器所管理的启动项的配置. 如果发现该启动项,那么选择器就会执行该启动项,从而实现了开箱即用的操作.
Spring Boot--02--自动装配原理_第11张图片
Spring Boot--02--自动装配原理_第12张图片

自动装配原理

启动类上注解的作用

Spring Boot--02--自动装配原理_第13张图片

SpringApplication.run方法----->>>相当于 SpringIoC的启动

@SpringBootApplication

这个注解是springboot启动类上的一个注解,是一个组合注解,也就是由其他注解组合起来,它的主要作用就是标记说明这个类是springboot的主配置类,springboot应该运行这个类里面的main()方法来启动程序

会看到@SpringBootApplication这个注解由好多注解组成,主要的有以下三个:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

Spring Boot--02--自动装配原理_第14张图片

@ComponentScan

  • 这个注解的作用主要作用就是扫描当前包及子包的注解,标识了需要装配的类,
  • 标识需要装配的类的形式主要是:@Component、@Repository、@Service、@Controller这类的注解标识的类。

这个扫描的范围是:SpringBoot主启动类的同级路径及子路径,扫描到特定的@Component、@Service、@Controler、@Repository、@Configuration等等注解后,会做相应的bean注册和配置文件bean注册工作。

Spring Boot--02--自动装配原理_第15张图片

@SpringBootConfiguration

这个注解包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组件
Spring Boot--02--自动装配原理_第16张图片

Spring Boot--02--自动装配原理_第17张图片

@EnableAutoConfiguration

Spring Boot--02--自动装配原理_第18张图片

  • @AutoConfigurationPackage
  • @Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage

这个注解的作用说白了就是将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中,这也就是为什么我们在利用springboot进行开发的时候,无论是Controller还是Service的路径都是与主配置类同级或者次级的原因

Spring Boot--02--自动装配原理_第19张图片

@Import(AutoConfigurationImportSelector.class)

上一个注解我们把所有组件都加载到了容器里面,这个注解就是将需要自动装配的类以全类名的方式返回,那是怎么找到哪些是需要自动装配的类呢?

1、AutoConfigurationImportSelector这个类里面有一个方法selectImports(),如下
Spring Boot--02--自动装配原理_第20张图片
2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法,这个方法里面又调用了一个getCandidateConfigurations()方法
Spring Boot--02--自动装配原理_第21张图片
3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法
在这里插入图片描述
5、关键就在这个loadSpringFactories()方法里面,在这个方法里,它会查找所有在==META-INF路
径下的spring.factories文件 ==

Spring Boot--02--自动装配原理_第22张图片
Spring Boot--02--自动装配原理_第23张图片
6、在META-INF/spring.factories这个文件里面的数据是以键=值的方式存储,然后解析这些文
件,找出以EnableAutoConfiguration为键的所有值,以列表的方式返回

Spring Boot--02--自动装配原理_第24张图片
Spring Boot--02--自动装配原理_第25张图片

自动装配本质

  1. SpringApplication.run方法----->>>相当于 SpringIoC的启动起来
  2. SpringBoot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理

如何实现 “自动”:通过配置文件获取对应的批量配置类,然后通过配置类批量加载bean定义,只要有写好的配置文件spring.factories就实现了自动。

你可能感兴趣的:(Spring基础知识--SSM,spring,boot,后端,java)