springboot自动装配?

作者&投稿:村菊 (若有异议请与网页底部的电邮联系)
~ SpringBoot自动装配原理

初看@SpringBootApplication有很多的注解组成,其实归纳就是一个"三体"结构,重要的只有三个Annotation:

(1)@Configuration注解

(2)@ComponentScan

(3)@EnableAutoConfiguration

从源码中可以知道,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。同时借助于Spring框架原有的一个工具类:SpringFactoriesLoader,@EnableAutoConfiguration就可以实现智能的自动配置。

总结:@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(JavaRefletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。这些功能配置类要生效的话,会去classpath中找是否有该类的依赖类(也就是pom.xml必须有对应功能的jar包才行)并且配置类里面注入了默认属性值类,功能类可以引用并赋默认值。生成功能类的原则是自定义优先,没有自定义时才会使用自动装配类。

1、从spring-boot-autoconfigure.jar/META-INF/spring.factories中获取redis的相关配置类全限定名(有120多个的配置类)RedisAutoConfiguration,一般一个功能配置类围绕该功能,负责管理创建多个相关的功能类,比如RedisAutoConfiguration负责:JedisConnectionFactory、RedisTemplate、StringRedisTemplate这3个功能类的创建

2、RedisAutoConfiguration配置类生效的一个条件是在classpath路径下有RedisOperations类存在,因此springboot的自动装配机制会会去classpath下去查找对应的class文件。

3.如果pom.xml有对应的jar包,就能匹配到对应依赖class,

4、匹配成功,这个功能配置类才会生效,同时会注入默认的属性配置类@EnableConfigurationProperties(RedisProperties.class)

5.Redis功能配置里面会根据条件生成最终的JedisConnectionFactory、RedisTemplate,并提供了默认的配置形式@ConditionalOnMissingBean(name="redisTemplate")

6.最终创建好的默认装配类,会通过功能配置类里面的@Bean注解,注入到IOC当中

7.用户使用,当用户在配置文件中自定义时候就会覆盖默认的配置@ConditionalOnMissingBean(name="redisTemplate")

1.通过各种注解实现了类与类之间的依赖关系,容器在启动的时候Application.run,会调用EnableAutoConfigurationImportSelector.class的selectImports方法(其实是其父类的方法)--这里需要注意,调用这个方法之前发生了什么和是在哪里调用这个方法需要进一步的探讨

2.selectImports方法最终会调用SpringFactoriesLoader.loadFactoryNames方法来获取一个全面的常用BeanConfiguration列表

3.loadFactoryNames方法会读取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar下面的spring.factories),获取到所有的Spring相关的Bean的全限定名ClassName,大概120多个

4.selectImports方法继续调用filter(configurations,autoConfigurationMetadata);这个时候会根据这些BeanConfiguration里面的条件,来一一筛选,最关键的是

@ConditionalOnClass,这个条件注解会去classpath下查找,jar包里面是否有这个条件依赖类,所以必须有了相应的jar包,才有这些依赖类,才会生成IOC环境需要的一些默认配置Bean

5.最后把符合条件的BeanConfiguration注入默认的EnableConfigurationPropertie类里面的属性值,并且注入到IOC环境当中

通过注解实现自定义SpringBootStarter自动装配

以Springboot作为微服务开发的项目中会用到很多第三方,或者自建的一些依赖SDK,例如分布式锁、文件管理、数据库连接、统一错误拦截等组件。为了达到通用的目的,都会创建自定义的springbootstater组件。以下介绍创建步骤:

一、创建Maven测试项目test-starterpom文件如下:

二、创建自动装配类TestServiceConfiguration.java

三、创建配置类TestServiceProperties.java

四、创建提供服务的接口TestService.java

五、创建TestService的实现类型TestServiceImpl.java

六、创建自定义注解@EnableTest

通过以上步骤就实现了自定义Springbootstartertest-spring-boot-starter组件,下面创建测试项目去调用这个starter组件。

创建starter组件使用项目

一、创建maven测试项目test-service,pom文件如下

二、创建启动类Application.java

三、创建配置文件application.yml

四、创建测试类TestController.java

到这里整个自定义springbootstarter创建就完成了,同时也依赖到项目中进行使用了。

项目代码:starter-test:自定义starter组件

SpringBoot的自动装配(一)

一、什么是SpringBoot的自动装配

??SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。

??自动的表现形式就是我们只需要引我们享用功能的包,其他的配置完全不需要管,springboot会自动注入这些配置备案,我们直接使用就行。

??自动装配也是SpringBoot的一个重要的特点,他帮我们做了很多的配置。

二、它是怎样实现的?

??1、run方法

????当启动一个SpringBoot项目时,本质上就是执行了地洞累中的主方法,然后执行了run方法。

????ConfigurableApplicationContext这个对象就是ApplicationContext接口的一个子接口。

??其实SpringBoot项目的启动,本质上就是一个Spring的初始化操作。

2、@SpringBootApplication

??点开这个注解可以发现,这是一个组合注解,包括:

??????这些注解中,前四个是JDK中的自动元注解,是用来修饰注解的注解。@ComponentScan是用来扫描路径的,如果不置顶特定的扫描路径的话,扫描的路径是当前修饰的类所在的包及其子包。而@SpringBootConfiguration这个注解的本质就是@Configuration注解。所以在这里面跟SpringBoot自动装配有关系的就只有一个了:@EnableAutoConfiguration

??3、@EnableAutoConfiguration

???@AutoConfigurationPackage不是用来实现自动装配的,在Spring中,他是用来扫描实体类Entity等注解的。所以重点是在@Import上。

??@Import注解实现了AutoConfigurationImportSelector类,自动装配也是在这个类中进行了具体的实现。自动装配实现的就是该类中的selectImports方法里。通过selectImports方法,取到spring.factories文件下的一系列类名,随后将这些类自动加载至IOC容器中。

??4、总结

????SpringBoot的自动装配也就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描spring.factories文件下的自动配置类,并将其装配到IOC容器的过程。

SpringBoot自动配置/装配(SPI)

自己动手写一个启动器的经历:

这里报错了,原因是只导入了一个bean而SpringBoot无法启动服务器

解决办法一:将@Import改成@ConponentScan这样就会扫描同级包和子包。

解决办法二:关闭web服务器

自动装配的大概流程:@EnableAutoConfiguration目的是自动装配在Maven中的第三方依赖,然后通过@Import(seleter)导入selecter,再通过selecter找到对应的.factories文件最终加载了打上@Configuration的文件。

首先开启了自动装配

通过Selector方法返回对应的类的名字

SPI全名为ServiceProviderInterface

模块实现方案

|?|?|?|?|?|?|???????方案A

调用方标准服务接口??方案B

|?|?|?|?|?|?|???????方案C

基于interface+策略模式+配置模式

整体解决方案的变化

与@Primary@条件注解的区别:具体/粒度小。




springmvc是微服务框架吗?
Springboot与Springcloud是什么关系 pringboot我理解就是把springspringmvcspringdatajpa等等的一些常用的常用的基础框架组合起来,提供预设的配置,然后提供可插拔的设计,就是各种starter,来方便开发者使用这一系列的技术,套用官方的一句话,spring家族发展到今天,已... 这个跟springmvc一样的啊,首先你看你的spring-mvc.xm...

Alibaba Nacos在Spring Cloud中的配置加载顺序超详细分析结果
1、JDK:OpenJDK 11 2、SpringBoot:2.3.0.RELEASE 3、SpringCloud:Hoxton.SR4 4、Nacos:2.2.1.RELEASE 二、bootstrap.properties 配置信息如下:环境参数 dev,sit,prod spring.profiles.active=dev spring.application.name=demo-core spring.cloud.nacos.config.server-addr=http:\/\/ pring.cloud...

driver does not support get\/ set network timeout for connections错误...
Driver does not support get\/set network timeout for connections错误的原因:pringboot 2.x默认的数据源变成了HikariPool了,弄了一个demo在使用数据源的时候系统报错 HikariPool-1 - Driver does not support get\/set network timeout for connections. (null)。具体的解决办法:通过源码排查到连接...

Driver does not support get\/ set network timeout for connections是什...
Driver does not support get\/set network timeout for connections错误的原因:pringboot 2.x默认的数据源变成了HikariPool了,弄了一个demo在使用数据源的时候系统报错 HikariPool-1 - Driver does not support get\/set network timeout for connections. (null)。具体的解决办法:通过源码排查到连接...

driver does not support get\/ set network timeout for connections什么...
Driver does not support get\/set network timeout for connections错误的原因:pringboot 2.x默认的数据源变成了HikariPool了,弄了一个demo在使用数据源的时候系统报错 HikariPool-1 - Driver does not support get\/set network timeout for connections. (null)。具体的解决办法:通过源码排查到连接...

driver does not support get\/ set network timeout for connections什么...
Driver does not support get\/set network timeout for connections错误的原因:pringboot 2.x默认的数据源变成了HikariPool了,弄了一个demo在使用数据源的时候系统报错 HikariPool-1 - Driver does not support get\/set network timeout for connections. (null)。具体的解决办法:通过源码排查到连接...

java五层架构(java五层架构模式书)
_SpringBoot框架。SpringBoot是Spring开源组织下的一个子项目,也是Spring组件的一站式解决方案,主要是为了简化使用Spring的框架难度。 ? _摹CloudSpring。 _馐且幌盗锌蚣艿挠行蚣希悄壳白钊让诺奈⒎窨蚣艿氖籽J紫龋_pringBoot开发的便利性,巧妙地简化了分布式系统基础的开发,如服务发现注册、配置中心、消息总线、...

无盘网吧系统如何安装?网上有成套的系统和教程吗?
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

VMware虚拟机能不能让另一台电脑的系统在我的电脑中安装运行?
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

怎么解决网吧安装程序重起更新的问题?
进入BIOS设置找到 “LAN BOOT”之类,由“Disabled”改为“Enabled” ,具体可参考主板说明文件。按F10保存退出。如是8139类的网卡可在开机显示”SHIFT + F10”的时候,按住右“SHIFT”键加 “F10”进入网卡启动设置画面,在第一项中选择“PXE”,第二项选择“Int 19” 最后按“F4”保存退出。这时工作站应该能够无盘...

宁武县17676601010: SpringBoot自动装配原理是什么? -
从涛磷酸: 这个问题是我培训结束后找工作的必问问题: (1)引导类上开启@EnableAutoConfiguration (2)内部通过@import注解引入ImporttSelector (3)查找工程jar包中META-INF/spring.factories文件 (4)装载内部的对象到容器 经过在传智播客的半年集中式学习从小白也能到大牛了,哈哈.

宁武县17676601010: 面试问题spring boot自动配置是怎么实现的 -
从涛磷酸: 在config里面配置auto-scann就行了,自动扫描指定的包和类

宁武县17676601010: Spring中的自动装配有哪些限制 -
从涛磷酸: 有三种方式.需要配置是自动装配.还是通过getset方法,亦或者通过构造函数等..

宁武县17676601010: spring自动装配是什么意思 -
从涛磷酸: spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自 动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean).由于 autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用.autowire的 方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥

宁武县17676601010: spring五种自动装配的方式,哪些描述是正确的 -
从涛磷酸: Spring自动装配(autowire)麻烦吗? 简单介绍一下Spring 中autowire(自动装配)那首先问问你,你觉得spring中autowire(自动装配)好吗? 如果使用它可能会降低可读性和可维护性,但是在spring中类与类之间的依赖都用标签来连接,这样太费事了

宁武县17676601010: spring自动装配有几种方式 -
从涛磷酸: spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、<constructor-arg>).IOC容器会自动建立javabean之间的关联关系.如果没有采用自动装配的话,手动装配我们通常在配置文件中进行...

宁武县17676601010: spring中自动装配有哪几种模式 -
从涛磷酸: java类(POJO),xml配置文件,注解

宁武县17676601010: java中spring的自动装配和注入的区别 -
从涛磷酸: 问题描述 如果一个Bean需要注入很多属性,每个属性都要显示注入,就会显得很麻烦. 解决方案 让Ioc容器自动为Bean指定引用. 方法之一---在XML配置文件实现自动装配 Car.java package com.zzj.bean;public class Car {public void ...

宁武县17676601010: 如何编写Spring - Boot自动配置 -
从涛磷酸: 第一步,编写配置Bean——PrintAfterInitBean 代码如下,因为只是一个简单例子,这里的配置Bean其实可以是其他任何复杂配置Bean,例如DataSource.往往一个公共包需要多个这样配置Bean才能完成其配置.public class PrintAfterInitBean...

宁武县17676601010: spring有哪些自动装配方式 -
从涛磷酸: 是必须使用Form的方式来使用吗?如果不是的话有两种方式你可以选择,最简单的就是使用动态Action获取表单参数.但是现在主流的做法是Ajax传参,这种方式能够大大减少你的代码量.至于你说的Bean和Spring的问题,一般情况下这个都不在考虑范围,Spring封装的是过程,而不是实体对象

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网