00_SpringBoot

  • 时间:
  • 来源:互联网
  • 文章标签:

总结自动配置原理

@SpringBootApplication = @SpringBootConfiguration + @ComponentScan + @EnableAutoConfiguration +

@SpringBootConfiguration
底层是Configuration注解,就是支持JavaConfig的方式来配置,使用Configuration配置类等同于XML文件。

@ComponentScan 扫描当前类下包的所有组件
扫描注解:扫描当前类下的package。将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。

@EnableAutoConfiguration 自动载入程序所需要的默认配置
自动载入程序所需要的所有默认配置。比如你的类路径下有tomcat-emdeded.jar包,那么你很可能需要TomcatServletwebServerFatory。

自动配置,加载META_INF/Spring.factories文件信息,筛选出以@EnableAutoConfiguration为key的数据,加载到IOC容器,实现自动配置。

它有两个比较重要的注解:@AutoConfigurationPackage @Import

@AutoConfigurationPackage 默认情况下,将主配置类的所在包及其子包的组件扫描到Spring容器中。貌似和ComponentScan一样。
区别:平时开发用的@Controller/@Service/@Component/@Repository是由ComponentScan扫描的。有可能你用了Spring Data JPA,在实体类上写@Entity注解。@Entity注解是由@AutoConfigurationPackage扫描加载的。

@Import
SpringBoot启动时,扫描所有jar路径下的META_INF/Spring.factories,将其文件包装成Properties对象。从Properties对象中获取到key为@EnableAutoConfiguration的数据,然后加载到容器里边。

一、初步认识SpringBoot

特点:
内置tomcat,不需要打成war包
启动器,
自动配置spring和第三方依赖
可以快速的搭建应用。

解决了什么问题:
复杂的配置
混乱的依赖管理

以前,定义一个bean,就需要定义bean标签,不停的在业务和配置文件中切换。
bean一旦很多,很麻烦。

jar版本可能相互之间不匹配。


二、写一个简单的SpringBoot程序

1.启动器背后是一堆的依赖,依赖不会冲突。
不需要web.xml,

引入一个启动器,就可以自动加载配置
在这里插入图片描述

2.创建controller
@resController 返回的都是jason的数据
@RequestMapping(“hello”)全局配置

少了注解
在这里插入图片描述
没加@EnableAutoConfigure之前,项目没有web.xml
在这里插入图片描述
3.启用自动配置@EnableAutoConfiguration
在这里插入图片描述入口是/
在这里插入图片描述


三、原理

SpringBoot怎么自动配置
@EnableAutoConfiguration
根据你的classpath中定义了哪些bean,猜测和配置你需要的一些bean。
比如:你有有一个tomcat的jar包,就会认为即需要web先关的配置,会给你配置进去。
SpringBoot看你引入了哪些依赖,根据依赖跟你配置。除非你覆盖默认配置。
在这里插入图片描述

优化

应该将main方法独立出来,不应该放在controller里面。启动一次,可以访问多个controller,
以前扫描所有controller,要加注解扫描
@ ComponentScan 组件扫描
扫描该类所在的包,以及包下的子子孙孙的包。
所以通常把包放在引导类Application放在工程包下。
SpringBoot应用的入口

配置主键扫描指令@Configuration
可以通过basePackingClasses或basePackages特定包来进行扫描。
如果没有指定特定类,从这个类的包进行扫描,以及这个包所在的子子孙孙包。

通常不指定,因为就想扫描所有的包

Java配置

组合注解:
SpringBootApplication = @EnableAutoConfiguration + @ComponentScan + @SpringBootConfiguration

@SpringBootConfiguration本质就是一个@Configuration,Java配置类

自动配置原理

SpringBoot没有任何xml配置,如果要配置信息怎么办?
比如配置连接池信息,现在该如何配置
在这里插入图片描述

回顾一下历史

推荐使用Java配置,代替xml配置。
Spring 1.0
注解开发尚未盛行,xml配置,一个controller,一个service就配置一个bean,bean太多。
Spring2.0
xml配合注解
Spring3.0
Spring注解很完善,Java配置代替xml配置

尝试java配置

在这里插入图片描述
写一个Java配置类
先需要
在这里插入图片描述
文件中获取四大参数
在这里插入图片描述
声明是一个配置类,需要

玩springboot就是找相应的启动器
在pom.xml中加上数据库连接池依赖

自己定义一个JdbcConfiguration
@Configuration 表明JdbcConfiguration是一个配置类
@PropertySource(“classpath:jdbc.properties”) JdbcConfiguration类属性里的值在classpath:jdbc.properties的资源文件里

在这里插入图片描述
测试,在Controller中注入datasource,说明DataSource已经注入到Spring容器中了。
在这里插入图片描述
四大参数也注入成功
在这里插入图片描述

属性配置文件,SpringBoot只有一个配置文件,aplication.properties

优化:属性最好单独写在一个文件里,因为别的类也有可能需要这些属性
如果在一个统一的属性类中读取,将来再任何配置类中都可以使用。
在这里插入图片描述
添加一个类专门去做属性的读取,JdbcProperties
读取JDBC属性文件
在这里插入图片描述
@ConfigurationProperties只会读取application.properties里的配置。所有配置放在application.properties

所有内容都在application.properties,再也不需要jdbc.prpoerties
在这里插入图片描述
在这里插入图片描述
都在一个里面,怎么区分不同的配置,通过前缀,例如jdbc…的jdbc
@ConfigurationProperties的@AlisaFor("prefix)
在这里插入图片描述
前缀:jdbc
属性类JdbcProperties,通过JdbcProperties类中的setget方法,将application.properties中的四大参数注入到JdbcProperties类的属性里。(通过get和set方法将application.properties中的四大参数注入到JdbcProperties类的属性里)
setget属性字段名和资源字段名一致,否则读取不到。
在这里插入图片描述
回顾刚刚:
JdbcPropeties资源属性读取类中通过@ConfiguarionProperties(prfix=“jdbc”)来把application.xml中的属性添加到资源属性读取类JdbcPropeties的属性中。

回到JdbcConfiguration类里

资源属性读取类JdbcPropeties
原来在JdbcConfiguration类里的连接池属性就不需要了,通过JdbcPropeties类来读取属性,

在JdbcConfiguration类中怎么使用资源属性读取类JdbcPropeties?
1.实例化注入 @Autowried注入属性对象JdbcProperties
2.构造函数注入 属性对象JdbcProperties
3.@Bean参数注入 属性对象JdbcProperties
4.不要Java属性类,直接在@Bean方法上使用@ConfigurationProperties(prefix=“jdbc”)注入属性JdbcProperties。
在这里插入图片描述
实例化注入:
在JdbcConfiguration类中加上@EnableConfiguarionProperties,启用属性读取类。将来属性读取类有多个,这个配置文件不是需要所有属性读取类
在这里插入图片描述
在这里插入图片描述
构造函数注入
在这里插入图片描述
参数注入
在这里插入图片描述
@ConfigurationProperties,在JdbcProperties类上的时候,调用JdbcProperties类上的set或get方法注入。
@ConfigurationProperties,在DataSource方法时,调用DataSource对象的set和get方法设置。DataSource对象也有get和set方法。
在这里插入图片描述

哪一种比较好,
第一种最多,通过@Autowried注入属性对象。


常用注解

在这里插入图片描述

SpringBoot的四种属性注入

1.@Autowired注入
2.构造方法注入
3.@Bean方法注入
4.直接在@Bean方法使用@ConfigurationProperties(prefix = “jdbc”)

SpringBoot中的默认配置

@EnableAutoConfiguration会开启SpringBoot的自动配置,根据你的依赖生效对应的默认配置。

问题:
例如自动配置SpringWebMvc:引入SpringMVC,就有三个类
@ConditionlOnClass({Servlet.class, DispacherServlet.calss, WebMvcConfiguration.class})

只要引入SpringMVC依赖依赖,满足条件@ConditionalOnMissingBean(WebMvcConfigurationSupport.class),就会触发自动配置。

这些默认配置时怎么配置的,在哪里配置的?
有一个默认配置的包,项目中,spring-boot-autoconfiguration.jar的包

为何依赖引入就会触发配置呢?
WebMvcConfiguration.java

@ConditionlOnClass({Servlet.class, DispacherServlet.calss, WebMvcConfiguration.class})

Servlet.class, DispacherServlet.calss, WebMvcConfiguration.class这些类存在的时候,就认为引入了相关依赖,只有引入了SpringMVC依赖时,才会引入这些类。才会启动当前配置

项目中有这3个bean时,启动当前配置

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
不能有这个WebMvcConfigurationSupport.classbean时,启动当前配置。
因为这个bean时自定义配置的接口,如果要自定义配置,需要实现这两个接口。
如果自定义配置了,就不使用自动配置
所以当不存在情况下,才会使用当前自动配置。

在这里插入图片描述

这些默认配置的属性来自哪里?
WebmvcConfiguration 配置类
WebmvcProerties 属性读取类

也是有mvcProperties资源属性读取类
在这里插入图片描述
WebMvcAutoConfiguration配置类里启用了WebmvcProperties,
四种方法注入资源属性读取类
@Autowired 注入资源属性读取类对象
构造方法 注入资源属性读取类对象
在这里插入图片描述
webMvcProperties的资源属性读取类
读取以spring.mv开头的配置文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


SpringBoot自动配置包
在这里插入图片描述
在这里插入图片描述
SpringMVC是一个Servlet框架,
在这里插入图片描述
在这里插入图片描述
以前在文件中,配置过视图解析器,映射器,适配器

在这里插入图片描述
映射器
在这里插入图片描述
适配器
在这里插入图片描述
内部视图资源解析器

在这里插入图片描述


总结

在这里插入图片描述
引入相关依赖,才能由这些class,才能满足配置类条件
自己没有配置,
通常情况下不会自己实现这两个接口,自定义配置
而是会覆盖默认配置

在这里插入图片描述
spring的大量自动配置,如果想要覆盖,替换成想要的值
在这里插入图片描述

在这里插入图片描述


创建一个空的工程:
在这里插入图片描述
创建module
在这里插入图片描述
在这里插入图片描述
引入依赖:
在这里插入图片描述

进入spring官网
在这里插入图片描述
在这里插入图片描述
查看建立springboot项目的依赖
在这里插入图片描述

在这里插入图片描述
所有的springboot应用都要以该工程org.springframework.boot为父工程。

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.14.RELEASE</version>
</parent>

依赖:
在这里插入图片描述

本文链接http://www.taodudu.cc/news/show-82928.html