| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> SpringBoot_第四章(自动装配) -> 正文阅读 |
|
[Java知识库]SpringBoot_第四章(自动装配) |
目录 2.2:@Import({Registrar.class}) 注解的源码 2.3:@Import({AutoConfigurationImportSelector.class})? 注解的源码 3.5:@ConfigurationProperties和@EnableConfigurationProperties注解 1:自动装配1.1:未使用自动装配之前在传统的springmvc项目中,当我们需要使用mvc模块、mysql数据模块、redis缓存模块的时候。我们需要导入依赖的jar,然后在spring的配置文件中配置dataSource、sqlsessionFactory、internalResourceViewResolver(视图解析器)、multipartResolver(文件上传)、事务管理器等模块。把这些我们需要的模块变成bean,给spring管理。 在了解自动装配之前,我们首先来回顾一下以前的springMVC项目。在MVC中我们使用容器依赖的bean的时候需要在xml中配置声明才能使用,比如springmvc中的以下配置。 在web.xml中配置dispatcherServlet和filter 在bean.xml配置视图解析器、文件上传multipartResolver、数据源等配置 没用使用自动装配之前,这些庞杂的web配置是每一个项目必须的。我们首先在pom中引入相关的jar。然后再xml中一遍一遍的配置这些东西。 十分复杂低效。 1.2:初步了解自动装配springboot是一个脚手架工具,约定大于配置。我们只需要按照springboot的规范来开发,就能减少很多配置,当需要开发web项目的时候。 第一步:引入web包的starter启动器。这个包就包含了web的所需的主要功能,同时能导入springweb相关的依赖jar。比如spring,springmvc的包和tomcat的包。点击pom可查询。
第二步:?我们启动springboot项目之后,就能看到所有的bean。这些bean在容器加载的时候就会把bean自动加载进来。
截图可以看到控制台的各种bean已经被spring容器管理了。 比如multipartResolver、DispatcherServlet、视图解析器、事务管理器等。我们就可以直接使用了,不需要在xml中配置这些东西了。 ? 2:自动装配2.1:首先来了解springboot的启动类注解
在启动类中有一个注解就是@SpringBootApplication,他有三个子注解,子注解又有其他的注解,搞清楚这些注解的意思就能理解自动装配了。
在这三个注解中,第一和第三都没有太大的意思,所以我们主要看第二个注解就好了。在第二个注解中使用了两个@import注解。就是这两个注解解释了自动装配的含义。 2.2:@Import({Registrar.class}) 注解的源码?@Import({Registrar.class})源码的作用就是:主启动类注册到容器,也没有大的作用。 2.3:@Import({AutoConfigurationImportSelector.class})? 注解的源码源码的第一步就是实现ImportSelector接口的ImportSelector方法,根据类的全部限定名字把类注入到容器(参见import注解的用法),注入了那些类呢?接着看源码 此处源码是获取自动装配的配置类。获取了138个,在哪里获取接着看。? ?这里的代码就能看出来去哪里加载了这些自动装配的类,在factories文件中。 我们查看autoconfigure的jar下边的factories文件就能看到这些指定的自动装配类全类名了。 2.4:自动装配含义springboot自动装配: 这就是自动装配,通过@SpringBootApplication注解的两个Import子注解 ,把spring-boot-autoconfigure-2.6.7.jar和其他包的spring.factories 文件中,EnableAutoConfiguration配置的所有类都装配到spring容器中了。 2.5:自动装配扩展springboot自动装配的扩展:两个疑难问题讲解 问题1:我们查看spring.factories中有当前版本支持的所有配置类,这些配置类都会注入bean吗? 答:并不是,之后我们需要导入相对的jar包,这个类是真是存在的,然后才可以自动装配这些bean。 举例说明:在spring.factories中有很多配置类,我们截取这几个来说明 举例1:我们没有配置DispatcherServlet,但是会通过自动装配,层层判断来自动创建出DispatcherServlet ?举例2:我们Aop的案例 问题2:在spring的IOC注入了这些138个配置类,我们怎么使用? 答:通过配置使用,约定大约配置。 比如我们使用文件上传。我们怎么知道配置文件上传的文件大小、文件路径等信息。在源码中我们可以看到怎么使用。约定大于配置 springboot默认创建StandardServletMultipartResolver,在源码中如下 ?文件上传约定大约配置,我们都知道ConfigurationProperties注解的作用是绑定配置文件的值。这里就是约定大于配置。我们只需要按照约定来就行了 ? ???????? ? ? 自动装配总结: 1:springboot默认加载spring.factories中指定的所有AutoConfiguration。 2:根据这些AutoConfiguration的源码,在里边的条件判断是否真正的使用这些类。 3:导入的对应jar话就使用这些类,并且在绑定的Properties根据前缀中指定,然后在配置文件中配置属性 这就是自动装配了。 3:注解说明3.1:@Component注解使用Component注解可以使一个类直接变成spring容器可以管理的bean, 我们知道@controller @service的注解里边都有?Component,就是直接声明自己编写的代码是bean。法 3.2:@Configuration和@Bean注解?@Configuration注解也是把类变成bean,?@bean注解用来创建具体的bean,代码案例如下。 主要作用 1:是将第三方依赖的jar的指定类变成bean,在第三方中你没法修改代码,加bean注解,可以使用此种方式 2:解决组件依赖,详细见代码注释
扩展1:无论@Configuration(proxyBeanMethods=true)还是false,注入的话都是一个bean
扩展2:@Configuration(proxyBeanMethods=false)或者true,直接使用方法获调用取bean,才会出现容器检查bean是否存在的情况,用来解决循环依赖
3.3:@Import注解(自动装配的核心底层实现)?Import注解的作用:也是注入第三方类让他变成容器管理的bean,比@Configuration结合@bean功能更加单一。但是更加暴力简单 实现1:@import(类.class) 直接指定类让容器管理 实现2:@import(选择器.class) 实现选择器,让选择器可以使用数组,把很多类都注入到容器中,这就是依赖注入的核心代码 3.4:@ImportResource注解作用:我们可以使用ImportResource注解,来装配配置文件xml中的bean。 在springboot项目中,都是使用了注解,但是外部可能存在spring的XML文件里边声明了bean。导致无法使用,所用使用importresource注解来装配bean 用法案例:类和bean声明。? ? 测试代码: 3.5:@ConfigurationProperties和@EnableConfigurationProperties注解作用:此注解的作用是,将spring的properties或者yml中配置的属性值,注入到bean中 必须和@Component注解结合使用 也可以只分开使用@Component 和@EnableConfigurationProperties(Person.class) 测试代码: 3.6:@validation注解作用:主要用来验证前端传递过来的数据,是否合乎规范 使用案例: 第一步:导入jar
第二步:在实体类上使用注解validation,属性上使用其他的@notnull@max等注解,限制属性的范围 测试代码见3.5的截图,里边有注释和测试。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/31 7:10:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |