当前位置:首页 > 经验 >

springboot菜鸟教程(菜鸟教程spring boot)

来源:原点资讯(www.yd166.com)时间:2022-10-29 12:02:31作者:YD166手机阅读>>


我们可以去到上边提到的spring.factories文件中去看一下,找到spring官方提供的spring-boot-autoconfigure包,在其下去找一下该文件:

springboot菜鸟教程,菜鸟教程spring boot(5)


可以看到这个就是SpringBoot官方为我们提供的所有自动配置类的候选列表。我们可以在其中找到一个我们比较熟悉的自动配置类去看一下它内部的实现:

可以看到这些一个个的都是JavaConfig配置类,而且都通过@Bean注解向容器中注入了一些Bean

springboot菜鸟教程,菜鸟教程spring boot(6)


结论:

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的所有自动配置类的全限定类名
  2. 将这些自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
  3. 整个J2EE的整体解决方案和自动配置都在spring-boot-autoconfigure的jar包中;
  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
2.1.2 自动配置的过程

自动配置类被注入到容器当中后,会帮我们进行组件的自动配置和自动注入的工作,我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释这个过程:

首先我们先看下SpringBoot中配置文件与POJO类之间映射的方法,这是进行自动配置的基础。
配置集中化管理:SpringBoot中所有可配置项都集中在一个文件中(application.yml),这个文件中的配置通过@ConfigurationProperties注解来与我们程序内部定义的POJO类来产生关联,这些POJO类统一命名为xxxProperties,并且这些xxxProperties类中各个属性字段都有自己的默认值,这也是SpringBoot约定大于配置理念的体现,尽可能减少用户做选择的次数,但同时又不失灵活性。只要我们想,配置文件中的配置随时可以覆盖默认值。

springboot菜鸟教程,菜鸟教程spring boot(7)


之后,通过配合@EnableConfigurationProperties注解,就可以自动将与配置文件绑定好的这个类注入到容器中供我们使用。
自动配置类的工作流程:

  • 根据限定的条件向容器中注入组件
  • 使用xxxProperties对注入的组件的相关属性进行配置

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration
//将与配置文件绑定好的某个类注入到容器中,使其生效
//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;
//并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties(HttpProperties.class)
//Spring底层@Conditional注解
//根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
//这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//判断系统中有没有CharacterEncodingFilter这个类,如果有配置类才生效
@ConditionalOnClass(CharacterEncodingFilter.class)
//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;
//matchIfMissing = true表明即使我们配置文件中不配置pring.http.encoding.enabled=true,该配置类也是默认生效的;
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
//该类已经与配置文件绑定了
private final HttpProperties.Encoding properties;
//构建该自动配置类时将与配置文件绑定的配置类作为入参传递进去
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name()); //注入bean时使用配置类中属性的值进行初始化,相当于将配置文件中的值映射到了组件的某些属性上
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter; //注入配置好的bean
}
}

一句话总结下自动配置类的工作过程 :

  • 首先容器会根据当前不同的条件判断,决定这个配置类是否生效!
  • 一但这个配置类生效;这个配置类就会给容器中添加相应组件;
  • 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着,配置文件可以配置什么内容,可以参照该前缀对应的属性类中的属性字段

//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// .....
}

2.2 SpringBoot自动配置使用总结

1、SpringBoot启动会加载大量的自动配置类
2、我们首先可以看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置里面的所有内容才生效;

@Conditional扩展注解

作用(判断是否满足当前条件)

@ConditionalOnNotWebApplication

当前不是web环境

@ConditionalOnWebApplication

当前是web环境

@ConditionalOnResource

类路径下是否有指定资源文件

@ConditionalOnExpression

满足SpEL表达式指定

@ConditionalOnMissingBean

容器中不存在指定的Bean

@ConditionalOnBean

容器中是否存在指定的Bean

@ConditionalOnSingleCandidate

容器中只有一个指定的Bean,或者这个Bean是首选Bean

@ConditionalOnJava

系统的java版本是否符合要求

@ConditionalOnMissingClass

系统中没有指定的类

@ConditionalOnClass

系统中有指定的类

@ConditionalOnProperty

系统中指定的属性是否有指定的值

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

#在配置文件中开启springboot的调试类
debug=true

Positive matches:(自动配置类启用的:正匹配)

Positive matches:
-----------------
AopAutoConfiguration matched:
- @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement' (OnClassCondition)
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
AopAutoConfiguration.CglibAutoProxyConfiguration matched:
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
AuditAutoConfiguration#auditListener matched:
- @ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.listener.AbstractAuditListener; SearchStrategy: all) did not find any beans (OnBeanCondition)
AuditAutoConfiguration#authenticationAuditListener matched:
- @ConditionalOnClass found required class 'org.springframework.security.authentication.event.AbstractAuthenticationEvent' (OnClassCondition)
- @ConditionalOnMissingBean (types: org.springframework.boot.actuate.security.AbstractAuthenticationAuditListener; SearchStrategy: all) did not find any beans (OnBeanCondition)

Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)

Negative matches:
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
AopAutoConfiguration.JdkDynamicAutoProxyConfiguration:
Did not match:
- @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 'proxy-target-class' (OnPropertyCondition)
AppOpticsMetricsExportAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'io.micrometer.appoptics.AppOpticsMeterRegistry' (OnClassCondition)
ArtemisAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

Exclusions、Unconditional classes(排除的、没有限定条件的自动配置类):

Exclusions:
-----------
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
Unconditional classes:
----------------------
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.actuate.autoconfigure.endpoint.jmx.JmxEndpointAutoConfiguration
org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration
org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration

springboot菜鸟教程,菜鸟教程spring boot(8)

栏目热文

mybatisplus 代码生成器(mybatisplus代码生成器模板)

mybatisplus 代码生成器(mybatisplus代码生成器模板)

简介: 代码生成器,也叫逆向工程,是根据数据库里的表结构,自动生成对应的实体类、映射文件和接口。代码生成器,也叫逆向工程...

2022-10-29 12:13:45查看全文 >>

springboot的starter原理(springboot starter核心组件)

springboot的starter原理(springboot starter核心组件)

前言我们都知道,Spring的功能非常强大,但也有些弊端。比如:我们需要手动去配置大量的参数,没有默认值,需要我们管理大...

2022-10-29 11:58:07查看全文 >>

mybatis作用及特点(mybatis优点有哪些)

mybatis作用及特点(mybatis优点有哪些)

a、MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带来了很...

2022-10-29 11:45:02查看全文 >>

mybatis工作原理分析(mybatis工作原理及项目操作配置)

mybatis工作原理分析(mybatis工作原理及项目操作配置)

前言:mybatis是最近几年比较流行的操作数据库框架了,平时都只知道怎么去配置,怎么去用它,那你们知道它是如何实现的吗...

2022-10-29 12:11:32查看全文 >>

mybatis简介(mybatis的详细讲解)

mybatis简介(mybatis的详细讲解)

一. mybatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache so...

2022-10-29 11:28:39查看全文 >>

mybatis详解(mybatis简单示例)

mybatis详解(mybatis简单示例)

MyBatis缓存框架与事务详解一、缓存的概念1.1什么是缓存 存在内存中的临时数据。 将用户经常查询的数据放在缓存(内...

2022-10-29 11:50:24查看全文 >>

简单的灯笼怎么叠(叠小灯笼方法)

简单的灯笼怎么叠(叠小灯笼方法)

过年啦,家家户户挂灯笼,今天教大家折一款樱花灯笼,颜值非常高,中间是一个樱花球,主要是做法超级简单。先剪一张圆形的纸,直...

2022-10-29 11:35:53查看全文 >>

一张纸叠灯笼(一张纸折灯笼大全)

一张纸叠灯笼(一张纸折灯笼大全)

树姐姐昨天发布的3款简单的灯笼很受到大家的欢迎,我好开心哦。离中秋越来越近了,今天树姐姐再给大家分享一款组合型的中式手提...

2022-10-29 12:02:02查看全文 >>

灯笼怎么叠的视频教程(手工灯笼的叠法)

灯笼怎么叠的视频教程(手工灯笼的叠法)

DIY动手实践能够让生活更美好,它让这一平淡的生活眼前一亮。喜欢动手是一种自信的表达方式,创意源于生活,细节决定品质,今...

2022-10-29 11:44:19查看全文 >>

灯笼怎么叠步骤图片(叠灯笼简易方法大全)

灯笼怎么叠步骤图片(叠灯笼简易方法大全)

爱生活,爱手工,我是爱做手工的小曦!中秋节马上就要到了,做个简单易学的灯笼吧!可以挂起来,也可以做成手提样式的。今天给大...

2022-10-29 12:13:09查看全文 >>

文档排行