SpringBoot原理初探

type = FilterType.CUSTOM,

classes = {TypeExcludeFilter.class}

), @Filter(

type = FilterType.CUSTOM,

classes = {AutoConfigurationExcludeFilter.class}

)}

)

public @interface SpringBootApplication

  • 各种配置拥有默认值

  • 默认配置最终都是映射到某个类上,如:MultipartProperties

  • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

  • 按需加载所有自动配置项

  • 非常多的starter

  • 引入了哪些场景这个场景的自动配置才会开启

  • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

@Import({User.class, DBHelper.class}) 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

@Configuration

1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的

  • 2、配置类本身也是组件

  • 3、proxyBeanMethods:代理bean的方法

  •  Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
    
  •  Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
    
  •  组件依赖必须使用Full模式默认。其他默认是否Lite模式
    

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入


@ImportResource

原生配置文件导入·

beans.xml===

<?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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd”>

@ImportResource(“classpath:beans.xml”)

public class MyConfig {}

======测试=

boolean haha = run.containsBean(“haha”);

boolean hehe = run.containsBean(“hehe”);

System.out.println(“haha:”+haha);//true

System.out.println(“hehe:”+hehe);//true


配置绑定

如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用;

public class getProperties {

public static void main(String[] args) throws FileNotFoundException, IOException {

Properties pps = new Properties();

pps.load(new FileInputStream(“a.properties”));

Enumeration enum1 = pps.propertyNames();//得到配置文件的名字

while(enum1.hasMoreElements()) {

String strKey = (String) enum1.nextElement();

String strValue = pps.getProperty(strKey);

System.out.println(strKey + “=” + strValue);

//封装到JavaBean。

}

}

}

@ConfigurationProperties

@Component + @ConfigurationProperties

/**

  • 只有在容器中的组件,才会拥有SpringBoot提供的强大功能

*/

@Component

@ConfigurationProperties(prefix = “mycar”)

public class Car {

private String brand;

private Integer price;

public String getBrand() {

return brand;

}

public void setBrand(String brand) {

this.brand = brand;

}

public Integer getPrice() {

return price;

}

public void setPrice(Integer price) {

this.price = price;

}

@Override

public String toString() {

return “Car{” +

“brand='” + brand + ‘’’ +

“, price=” + price +

‘}’;

}

}

@EnableConfigurationProperties(Car.class)

//1、开启Car配置绑定功能

//2、把这个Car这个组件自动注册到容器中

public class MyConfig {

}

1.自动配置原理

@SpringBootApplication

----@SpringBootConfiguration

---- @Configuration 代表当前为配置类

----@EnableAutoConfiguration

----@AutoConfigurationPackage 自动配置包

----@Import(AutoConfigurationPackages.Registrar.class) (给容器中导入一个组件,利用Registrar给容器中导入一系列组件

将指定的一个包下的所有组件导入进来?MainApplication 所在包下)

----@Import(AutoConfigurationImportSelector.class)

----@ComponentScan 指定扫描哪些

进入@Import(AutoConfigurationImportSelector.class)

在这里插入图片描述

在查看getAutoConfigurationEntry()方法

在这里插入图片描述

可以发现configurations 里面有很多配置类130个

在这里插入图片描述

进入getCandidateConfigurations(…)方法

最终到这个方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:

1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件

2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类

3、利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件

4、从META-INF/spring.factories位置来加载一个文件。

默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件

spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

2.按需开启自动配置

虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration

按照条件装配规则(@Conditional),最终会按需配置。

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 incorrectly

return resolver;

}

给容器中加入了文件上传解析器;

这个的意思是如果有自己配置的组件就用自己的,没有的话就自动给你创建一个。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-TIWZuMa1-1715073153640)]

[外链图片转存中…(img-Q5JX1cq6-1715073153641)]

[外链图片转存中…(img-qoyH3VoJ-1715073153641)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值