SpringBoot自动装配,比较全的吧,来看看吧~
文章挺长,表达不好,希望能有获~~~~~~~
Spring也提供使用注解来注册bean,为什么要用SpringBoot呢?
使用Spring应用,比如SpringMVC还行需要配置ViewResolver、DispatcherServlet,使用Mybatis等也需要进行其他配置。
如下为spring-mybatis配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 导入属性配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
</bean>
<!-- 将数据源映射到sqlSessionFactory中 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
<!--<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />-->
</bean>
<!-- SqlSession模板类实例 -->
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!--======= 事务配置 Begin ================= -->
<!-- 事务管理器(由Spring管理MyBatis的事务) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 关联数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--======= 事务配置 End =================== -->
<!--mapper配置-->
<bean id="kbCityMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.spring.dao.KbCityMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
SpringBoot进行自动配置不在需用使用者进行这些配置。而且使用SpringBoot也不需要管理Mybatis、log4j、jackson等依赖包的版本问题,SpringBoot使用starter进行依赖管理。
使用SpringBoot只需在application.yml
或application.xml
添加少量配置,通过@SpringBootApplication
即可启动应用。
自动装配的意义在于SpringBoot提前为我们初始化了一些东西,从SpringBoot文档中搜索Auto-configuration
对于JSON mapping libraries:
对于Spring MVC:
可以看到有对BeanNameViewResolver
的自动配置。
对于模板引擎:
可以看到对Thymeleaf
的自动配置,我们只需要引入Thymeleaf依赖就能直接用了,不需要任何配置。
对Reids:
还有对Security,Spring Data JPA,Elasticsearch等等很多很多,SpringBoot都对他们提前进行了一些配置,这样使得我们只需引入其依赖,只需要在application.yml
少量配置甚至不需要配置就可以直接使用。
那么SpringBoot是怎么实现的?
文档说让我们浏览spring-boot-autoconfigure
的源代码,那么我们就看看源码:
先说一下META-INF包下的,我们看一看additional-spring-configuration-metadata.json
这个文件里有啥呢?
我们看一看其中server.port
:
嗯,他默认值是8080,是不是很熟悉呢?我们进入我们项目的application.properties
那么我们再看看server.servlet.encoding.enabled
,server.servlet.jsp.class-name
这两个
这回我们知道原来application.properties
中的默认值是从additional-spring-configuration-metadata.json
这个文件来的呀。
接下来看看spring.factories
文件:
里面都是一些AutoConfiguration
类的完整类路径,那么我们有了类路径能干啥呢?那当然通过反射创建该类了。那么有这么多自动配置类肯定不会全部加载,那些我们要用到SpringBoot就加载哪些。
spring-autoconfigure-metadata.properties
:看其内容,等号左边为类路径或属性,右边或者类路径或者值或者空。应该跟我们平常的properties文件一样的意思吧,为了不将这些配置属性在代码中写死,将其提取出来放到properties文件中。
spring-autoconfigure-metadata.json
:只知道name与sourceType,type,sourceMethod建立映射关系,不知道干啥用。或许为了通过name标识值在代码中更清晰易懂吧。
继续向下看:
这里面可以看到很多熟悉的名字,我们以web包为例看一看吧:
这些类大致分为两种,一种AutoConfiguration
,一种Properties
。
题外话:我们知道SpringBoot扫描静态资源时会在/resources/, /static/, /public/这些路径下。我们看看WebProperties.java
接着我们以WebMvcProperties
和WebMvcAutoConfiguration
为例看一看吧。
WebMvcProperties
:就在这个属性类中完成了webMvc相关属性的初始化工作。
某些属性如下:
private String staticPathPattern = "/**";
public static class Servlet {
/**
* Path of the dispatcher servlet. Setting a custom value for this property is not
* compatible with the PathPatternParser matching strategy.
*/
private String path = "/";
public String getServletMapping() {
if (this.path.equals("") || this.path.equals("/")) {
return "/";
}
if (this.path.endsWith("/")) {
return this.path + "*";
}
return this.path + "/*";
}
}
WebMvcAutoConfiguration
:这个类就通过get方法,从上面的properties文件中取值,有了这些属性值,那么就能完成webMvc相关类的初始化工作了!!!
接下来从springbootApplication注解,进入来看看吧。
@SpringBootConfiguration
:进去看后是一个@Configuration
,因此SpringBootConfiguration注解的作用是将其注解的类注册到spring中。
@ComponentScan
:组件扫描类,在此包下的被controller,service,component等注解类注册到spring中。
@EnableAutoConfiguration
:以下主要分析。
查看@AutoConfigurationPackage
:
进入AutoConfigurationPackages.Registrar.class
:
debug一下registerBeanDefinitions
方法:
通过上面的gif我们可以看到registerBeanDefinitions
这个方法应该就是注册我们自己包下所有bean。
接着进入AutoConfigurationImportSelector.class
:
进入getAutoConfigurationEntry
->getCandidateConfigurations
->loadFactoryNames
->loadSpringFactories
这里会获取到spring.factories文件,然后加载他,然后循环遍历将其放入result中。
我们debug进入时:
result为一个map,我们以org.springframework.boot.autoconfigure.EnableAutoConfiguration
为key,取出那size为130的List<String>
。
现在我们从getCandidateConfigurations
出来了,configuration
的size大小130,然后去重,排除。
在执行getConfigurationClassFilter().filter(configurations);
方法前configurations
的size还为130。
执行之后:
最终我们加载了这23个配置类。
如何创建自己的starter:
demo project我看了,六年前更新的,使用的springboot1,很老的版本了。这个示例的pom的依赖引入的很繁杂,可以看看人家写的自动配置类,挺齐全的。
三个点:
- pom文件引入springboot依赖(我看guide哥的博客,直接引入这个依赖就能用了。)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.5</version>
<scope>compile</scope>
</dependency>
- 创建自动配置类,其上有必须
@Configuration
,其他约束性注解根据情况添加 - 将这个自动配置类写到,spring.factories文件
终于完结。
SpringBoot自动装配,比较全的吧,来看看吧~的更多相关文章
- springboot自动装配
Spring Boot自动配置原理 springboot自动装配 springboot配置文件 Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置.难以集成的内容(大多数流行第 ...
- SpringBoot自动装配原理解析
本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...
- 【Springboot】Springboot自动装配原理
1.核心注解就是 EnableAutoConfiguration 该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...
- SpringBoot自动装配-自定义Start
SpringBoot自动装配 在没有使用SpringBoot之前,使用ssm时配置redis需要在XML中配置端口号,地址,账号密码,连接池等等,而使用了SpringBoot后只需要在applicat ...
- SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的
系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...
- 一步步从Spring Framework装配掌握SpringBoot自动装配
目录 Spring Framework模式注解 Spring Framework@Enable模块装配 Spring Framework条件装配 SpringBoot 自动装配 本章总结 Spring ...
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- springboot自动装配(3)---条件注解@Conditional
之前有说到springboot自动装配的时候,都是去寻找一个XXXAutoConfiguration的配置类,然而我们的springboot的spring.factories文件中有各种组件的自动装配 ...
- Spring Boot之从Spring Framework装配掌握SpringBoot自动装配
Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...
- springboot自动装配原理
最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...
随机推荐
- 使用 Tye 辅助开发 dotnet 应用程序
newbe.pro 已经给我们写了系列文章介绍Tye 辅助开发k8s 应用: 使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye ...
- R语言低级绘图函数画个温度计
x <- 1:2 y <- runif(2,0,100) par(mar=c(4,6,2,6)) plot(x,y,type="n",xlim=c(0.5,2.5),y ...
- 你好,布尔玛!(BulmaRazor)
Blazor 官方简介 Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...
- js 前端MD5加密
1.引入 <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script& ...
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(四):VDEC_Send_Stream线程分析
下面随笔将对Hi3559AV100外接UVC/MJPEG相机实现实时采图设计的关键点-VDEC_Send_Stream线程进行分析,一两个星期前我写了有三篇系列随笔,已经实现了项目功能,大家可以参考下 ...
- vscode动态调试
前言: 关于vscode动态调试php项目其实在网上有文章,但那些文章或多或少都有些坑点或者转载他人,未经验证过,几度重装系统重新配置的时候在网上看文章配置总是有点问题,所以这次自己写了一篇文章,从头 ...
- 关于,java-webservice接口,根据服务端,自动生成客户端调用时,响应时间慢
我这边遇到的问题,是在和对方进行webservice接口交互的时候,用工具,调用对方的webservice接口,对方响应很快.但是用java生成的客户端调用就会很慢才得到响应.大概有5分钟左右. 这里 ...
- 【odoo14】第五章、服务器侧开发-基础
本章包含如下内容: 定义模型方法和使用api装饰器 向用户反馈错误信息 针对不同的对象获取空数据集 创建新纪录 更新数据集数据 搜索数据 组合数据集 过滤数据集 遍历记录集 排序数据集 重写已有业务逻 ...
- nginx使用-2(模块和日志)
默认官方模块 1.1.Gzip压缩 压缩文件,使文件变小,传输更快了.目前市场上大部分浏览器是支持GZIP的.IE6以下支持不好,会出现乱码情况. 官方文档:http://nginx.org/en/d ...
- windows如何上传ios app到appstore
我们在hbuilderx这些开发工具打包好ios app后,需要将这个app提交appstore才能让用户下载安装. 上传IOS APP主要是通过苹果开发者中心来上传,然后借助香蕉云编上传工具来上传就 ...