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

Spring Boot--02--自动装配原理 SpringBoot项目启动过程分析找到项目的入口类使用了SpringBootApplication注解描述然后运行启动类检测启动过程SpringBoot在启动时控制台会出现上图标识SpringBoot 项目在启动时首先基于启动入口类上的(SpringBootApplication)注解描述进行自动配置并扫描指定包以及子包中的类进行加载然后检测类上是否有Spring框架中指定的注解描述例如Component,Controller,Service 等。假如有则将类交给Spring框架中的BeanFactory工厂接口的实现类对象此工厂对象会基于反射创建Bean的实例假如此Bean指定了生命周期方法还会调用生命周期方法。当实例创建以后Spring框架还会基于类的作用域描述将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。Spring框架管理Bean对象的优势Spring 是一个资源整合框架Framework,通过spring可将很多资源(自己写的对象或第三方提供的对象例如连接池等)整合在一起,然后进行科学应用以便更好的对外提供服务。懒加载策略Lazy(true) 默认为true作用域Scope(“singleton”) 默认单例生命周期方法lifecycle method PostConstruct PreDestroySpring框架可以为由它管理的对象Bean提供懒加载策略对象暂时用不到则无需加载和实例化作用域例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建不用时销毁生命周期方法更好实现对象的初始化和资源销毁以实现对象对系统资源的有效使用。同时Spring框架还可以基于用户设计管理对象与对象的依赖关系以降低对象与对象之间的直接耦合提高程序的可维护性和可扩展性。Autowired 注入 has aAutowired由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: 表示该类是一个配置类.3 excludeFilters 说明说明: 在springboot容器启动时,不需要加载某些过滤器.由于parent标签中定义了所有的关联的jar包文件信息.则启动时有可能导致意外的发生,所有需要提前剔除.4 AutoConfigurationPackage说明: 当程序启动时,会根据主启动类的包路径,扫描其子孙包,所以springboot以后写代码时应该在其子孙包下编辑.5 AutoConfigurationImportSelector说明:该配置中内部集成了所有的SpringBoot中的选择器.这些选择器的主要的任务就是查看是否有自己选择器所管理的启动项的配置. 如果发现该启动项,那么选择器就会执行该启动项,从而实现了开箱即用的操作.自动装配原理启动类上注解的作用SpringApplication.run方法-----相当于 SpringIoC的启动SpringBootApplication这个注解是springboot启动类上的一个注解是一个组合注解也就是由其他注解组合起来它的主要作用就是标记说明这个类是springboot的主配置类springboot应该运行这个类里面的main()方法来启动程序会看到SpringBootApplication这个注解由好多注解组成主要的有以下三个SpringBootConfigurationEnableAutoConfigurationComponentScanComponentScan这个注解的作用主要作用就是扫描当前包及子包的注解标识了需要装配的类标识需要装配的类的形式主要是Component、Repository、Service、Controller这类的注解标识的类。这个扫描的范围是SpringBoot主启动类的同级路径及子路径扫描到特定的Component、Service、Controler、Repository、Configuration等等注解后会做相应的bean注册和配置文件bean注册工作。SpringBootConfiguration这个注解包含了ConfigurationConfiguration里面又包含了一个Component注解也就是说这个注解标注在哪个类上就表示当前这个类是一个配置类而配置类也是spring容器中的组件EnableAutoConfigurationAutoConfigurationPackageImportAutoConfigurationImportSelector.classAutoConfigurationPackage这个注解的作用说白了就是将主配置类SpringBootApplication标注的类所在包以及子包里面的所有组件扫描并加载到spring的容器中这也就是为什么我们在利用springboot进行开发的时候无论是Controller还是Service的路径都是与主配置类同级或者次级的原因Import(AutoConfigurationImportSelector.class)上一个注解我们把所有组件都加载到了容器里面这个注解就是将需要自动装配的类以全类名的方式返回那是怎么找到哪些是需要自动装配的类呢1、AutoConfigurationImportSelector这个类里面有一个方法selectImports()如下2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法这个方法里面又调用了一个getCandidateConfigurations()方法3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法5、关键就在这个loadSpringFactories()方法里面在这个方法里它会查找所有在META-INF路径下的spring.factories文件 6、在META-INF/spring.factories这个文件里面的数据是以键值的方式存储然后解析这些文件找出以EnableAutoConfiguration为键的所有值以列表的方式返回自动装配本质SpringApplication.run方法-----相当于 SpringIoC的启动起来SpringBoot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件并生成相应的Bean对象然后将它们交给spring容器来帮我们进行管理如何实现 “自动”通过配置文件获取对应的批量配置类然后通过配置类批量加载bean定义只要有写好的配置文件spring.factories就实现了自动。