运维开发网

跳靴2自动装配原理分析

运维开发网 https://www.qedev.com 2022-09-16 16:07 出处:网络
这篇文章主要介绍了SpringBoot2自动装配原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

这篇文章主要介绍了SpringBoot2自动装配原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


1、SpringBoot特点


1.1 依赖管理

父项目进行依赖项管理。

springboot项目的父项目 lt;parentgt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-parentlt;/artifactIdgt; lt;versiongt;2.3.4.RELEASElt;/versiongt;lt;/parentgt; spring-boot-starter-parent的父项目 lt;parentgt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-dependencieslt;/artifactIdgt; lt;versiongt;2.3.4.RELEASElt;/versiongt; lt;/parentgt;

父项目集成了开发中常用的所有依赖版本号,称为自动版本仲裁机制。

注意:这并不是说不需要导入依赖项,而是在导入依赖项的时候会自动仲裁(匹配)版本号,相当于模具的功能。

导入初学者方案启动器

场景启动器的作用是:springboot已经帮助我们整合了所有应用场景的常规依赖。只要在依赖项中写了一个场景启动器,那么它下面的所有依赖项也都是一个一个导入的。

官方整合的场景启动器一般是:spring-boot-starter-*。只要引入starter,这个场景的所有常规需要的依赖都会自动引入。SpringBoot所有支持的场景都在:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html 这个地址里。第三方提供的简化开发的场景启动器一般是:*-spring-boot-starter所有场景启动器都有一个最底层的依赖lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starterlt;/artifactIdgt; lt;versiongt;2.3.4.RELEASElt;/versiongt; lt;scopegt;compilelt;/scopegt;lt;/dependencygt;

自动版本仲裁机制

意思是不需要关注版本号,就是即用。

注意:

您可以在父项目中引入集成的依赖项,而无需编写版本号。

但是,要引入没有版本仲裁的jar,需要写版本号。

如果对集成依赖项的版本号不满意,可以按如下方式修改默认版本号:

1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。2、在当前项目里面重写配置,如: lt;propertiesgt; lt;mysql.versiongt;5.1.43lt;/mysql.versiongt; lt;/propertiesgt;


1.2 自动配置

Springboot已经配置了那些繁文缛节的配置文件,所以我们不需要额外的配置。

例如:

1、Tomcat

2.SpringMVC(介绍一整套组件和常用函数)DispathcherServlet等。

3.常见的Web函数:字节编码和内部视图解析器。

4.默认扫描包结构

之前我们在方法上加注释,需要在配置文件中扫描包名等,现在已经不需要了。主程序Application所在包及其子包里面的组件都会被默认扫描进来如果想要改变扫描路径,可以在主程序上的springboot声明注解中设置scanBasePackages属性@SpringBootApplication(scanBasePackages="com.atguigu")public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class,args); }}

5.各种配置都有默认值。

如果需要更改默认值,可以在资源文件下创建application.properties并修改默认值。

默认配置的原则:

默认配置最终都是映射到某个类上,如:MultipartProperties配置文件的值最终会绑定每个类上,这个类会在容器中创建对象引入了哪些场景这个场景的自动配置才会开启SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里面


2、容器功能


2.1 组件添加


1、@Configuration/** * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的 * 2、配置类本身也是组件 * 3、proxyBeanMethods = true 默认是true 表示代理bean的方法 (动态代理) * Full模式(proxyBeanMethods = true) * Lite模式(proxyBeanMethods = false) * 组件依赖 */@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == xml配置文件public class MyConfig { /** * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象 * @return */ //给容器中添加组件,相当于bean标签,以方法名作为组件的id。 返回类型是组件类型,返回值就是组件在容器中的实例。 @Bean public User user01(){ return new User("zhangsan",18); } // 如果不想用方法名作为组件的id 可以修改Bean中的value属性,自定义组件id @Bean("tom") //此时组件id就不再是tomcatPet,而是tom public Pet tomcatPet(){ return new Pet("tomcat");}

完整模式和精简模式(新增版本)

配置类组件之间的依赖关系,用Lite模式加快容器启动过程,减少判断。

配置组件之间存在依赖关系,在完整模式下,将调用方法来获取以前的单实例组件。


2、@Bean、@Component、@Controller、@Service、@Repository

这些标注与春天学习的功能一致,不再赘述。


3、@ComponentScan、@Import

ComponentScan表示组件扫描。

@Import()

注释后面是一个类数组,用于在容器中自动创建这两种类型的组件,默认组件名是完整的包名。

(可以和@Bean方法创建的组件的方法名进行比较)。


4、@Conditional

条件汇编

@ConditionalOnBean(name = "tom")

该注释表明,只有IOC容器中具有tom名称的类才会注册该注释挂载的类/方法。


2.2、原生配置引入@ImportResource

当引入一些老项目或第三方包时,很可能会使用旧版本的xml来注册组件。您可以将这个注释添加到任何配置类中,并且可以引入导入的xml的地址。

用法:

1.首先,创建一个xml配置文件并编写一个bean

lt;bean id="user02" class="com.atguigu.boot.bean.User"gt; lt;property name="age" value="20"/gt; lt;property name="name" value="xcc"/gt; lt;/beangt;

2.向任何配置类添加@ImportResource注释。

@ImportResource("classpath:beans.xml")public class MyConfig {}


2.3 配置绑定


1、@ConfigurationProperties

一些需要提取和修改的配置,之前会以属性文件的形式存储,然后通过读取文件放入javabean,不过这个注释不用这么麻烦。

只要将要配置的类添加到容器中,然后使用@ConfigurationProperties注释,applicaton.properties文件中的属性就可以自动注入到该类中。

使用步骤:

1.创建一个实体类,然后添加@Component注释将该类注册到容器中。

2.用@ConfigurationProperties进行注释。前缀表示mycar开头的所有属性都是要注入的配置内容。

/** * 只有在容器中的组件,才会拥有springboot的强大功能 */@Component@ConfigurationProperties(prefix = "mycar")public class Car { //一些属性get、set方法云云 }

3.配置要在application.properties中注入的属性

mycar.brand = BYDmycar.price = 100000

注意:如果这个类被引入包中,不方便直接评论要注入的类。

这可以在配置文件中声明。

@EnableConfigurationProperties(Car.class)

该注释有两个功能:

1.打开配置绑定功能。

2.自动将组件注册到容器中。


3、自动配置原理入门


3.1 引导加载自动配置类

为什么springboot可以不使用xml文件在容器中注册组件(只有Bean)?

原因在于springboot主程序下的声明注释:

  @SpringBootApplication

该注释由三个注释组成:

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

@SpringBootConfiguration:

这个注释实际上是一个配置注释,声明主程序也是一个特殊的配置类。

@ComponentScan

这个注释起到扫描包的作用,指定扫描包的路径。

@启用自动配置

@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration {}

1 、@自动配置包

自动配置包,点击进入查看:

@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件public @interface AutoConfigurationPackage {} //利用Registrar给容器中导入一系列组件//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

首先Import导入一个组件,然后这个组件的作用是注册扫描包下的所有组件。

2 、@ Import(autoconfigurationimportselector . class)

如果选择了某些组件,则会自动对其进行配置。

1.使用getautoconfiguration条目(批注元数据);分批将一些组件导入容器
2。通话清单lt;Stringgtconfiguration s = Get candidate configuration s(注释元数据,属性)获取所有需要导入到容器中的配置类
3。使用工厂加载MapltString,ListltStringgtgt;loadSpringFactories(@ Nullable class loader class loader);获取所有组件
4。从meta-INF/spring.factors位置加载一个文件。
默认情况下,扫描我们当前系统中meta-INF/spring.factors位置的所有文件
spring-boot-auto configure-2 . 3 . 4 . release . jar包也包含meta-INF/spring.factors。

一般来说,springboot把所有环境的所有配置都写在各个工厂的配置文件里。


3.2 按需开启自动匹配项

27个场景的所有自动配置在启动时默认加载。Xxxutoconfiguration
原理:根据条件组装规则(@Conditional),加载选中的配置。


3.3 修改默认配置@Bean@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件public MultipartResolver multipartResolver(MultipartResolver resolver) {//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;}

文件上传解析器被添加到容器中;

Springboot在底层为我们封装了一个标注方法,修正了不符合规范的命名。

默认情况下,SpringBoot配置底层的所有组件。但如果是用户自己配置的,会给用户优先权。

* * * * * *摘要* * * * * * * *:

SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定生效的配置类就会给容器中装配很多组件只要容器中有这些组件,相当于这些功能就有了定制化配置用户直接自己@Bean替换底层的组件用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration-gt;组件-gt;获取xxxx-gt中的值;应用程序.属性


3.4 配置流程引入场景依赖https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html查看自动配置了哪些(选做)自己分析,引入场景对应的自动配置一般都生效了配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)是否需要修改参照文档修改配置项https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html自己分析。xxxxProperties绑定了配置文件的哪些。自定义加入或者替换组件@Bean、@Component。。。自定义器XXXXXCustomizer;.....


4、开发工具


4.1 lombok

Lombok可以简化javabean的编写。

我们在创建javabean类的时候,总是要写它的getset方法,toString方法,以及有参数和无参数的构造函数,很烦,代码也不清楚。

您可以添加lombok注释来简化书写。

使用前提:

1.添加龙目岛的依赖。

lt;dependencygt; lt;groupIdgt;org.projectlomboklt;/groupIdgt; lt;artifactIdgt;lomboklt;/artifactIdgt; lt;/dependencygt;

2.在插件市场安装lombok插件。

使用说明:

@ToString@Data@NoArgsConstructor@AllArgsConstructorpublic class Pet { private String name; }

@Data:自动写它的get/set方法。

@ToString:自动覆盖其ToString方法。

@NoArgsConstructor:写一个无参数的构造函数。

@AllArgsConstructor:写一个参数化的构造函数。应该注意,默认情况下,参数构造函数构造所有参数。如果要限制参数构造的数量,还是需要自己写。

@Slf4j:期刊评论。您可以通过log.info在控制台上打印消息


4.2 dev-tools

更新,修改方法或者页面的时候,用dev-tools(Ctrl+F9)重新编译就可以了,比重启项目还快。

lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-devtoolslt;/artifactIdgt; lt;optionalgt;truelt;/optionalgt; lt;/dependencygt;


4.3 Spring Initailizr(项目初始化向导)

在创建项目的时候,你只需要检查一下环境,它就会自动帮我们构建项目需要的环境。

所以我们只需要关注项目本身的代码。


关于SpringBoot2自动装配原理的这篇文章到此为止。关于SpringBoot2自动组装的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消