SpringBoot2----容器功能

3、@ComponentScan、@Import


4、@Import({User.class, DBHelper.class})

给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

@Import({User.class, DBHelper.class})

@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件

public class MyConfig {

}

@Import 高级用法:https://www.bilibili.com/video/BV1gW411W7wy?p=8


4、@Conditional


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

放在配置类上表示,当容器中满足条件时,配置类中的组件才生效;

放在配置方法上的时候,表示的意思是当满足条件的时候配置方法才生效;

在这里插入图片描述

=测试条件装配======

@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件

//@ConditionalOnBean(name = “tom”)

@ConditionalOnMissingBean(name = “tom”)

public class MyConfig {

/**

  • Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象

  • @return

*/

@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例

public User user01(){

User zhangsan = new User(“zhangsan”, 18);

//user组件依赖了Pet组件

zhangsan.setPet(tomcatPet());

return zhangsan;

}

@Bean(“tom22”)

public Pet tomcatPet(){

return new Pet(“tomcat”);

}

}

public static void main(String[] args) {

//1、返回我们IOC容器

ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//2、查看容器里面的组件

String[] names = run.getBeanDefinitionNames();

for (String name : names) {

System.out.println(name);

}

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

System.out.println(“容器中Tom组件:”+tom);

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

System.out.println(“容器中user01组件:”+user01);

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

System.out.println(“容器中tom22组件:”+tom22);

}


2.2、原生配置文件引入

===========================================================================

1、@ImportResource


将原生的Spring.xml的配置文件,通过@ImportResource导入后SpringBoot进行解析,完成对应的组件注册

位置:在某个配置类的上方

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”>

@Configuration

@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


2.3、配置绑定

=======================================================================

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


方式一:@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 +

‘}’;

}

}

对应的配置文件:

mycar.brand=“宝马”

mycar.price=100000

配置类:

@SpringBootApplication

public class SpringBoot2Demo1Application {

public static void main(String[] args)

{

ConfigurableApplicationContext app = SpringApplication.run(SpringBoot2Demo1Application.class, args);

Car car = app.getBean(Car.class);

System.out.println(car);

}

}

在这里插入图片描述


方式二: @EnableConfigurationProperties + @ConfigurationProperties


对应要绑定的类:

@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 +

‘}’;

}

}

对应的配置文件:

mycar.brand=“宝马”

mycar.price=100000

配置类:

@EnableConfigurationProperties(Car.class)

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

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

@SpringBootApplication

public class SpringBoot2Demo1Application {

public static void main(String[] args)

{

ConfigurableApplicationContext app = SpringApplication.run(SpringBoot2Demo1Application.class, args);

Car car = app.getBean(Car.class);

System.out.println(car);

}

}

在这里插入图片描述


小总结

一般使用这种方式

@EnableConfigurationProperties(Car.class) // 开启 Car 的属性配置并自动注入到容器中

public class MyConfiguration {

@ConfigurationProperties(prefix = “mycar”)//指定要与配置文件中以某前缀开始的值进行属性匹配

public class Car {


3、自动配置原理入门

=========================================================================

3.1、引导加载自动配置类===@SpringBootApplication的组合注解如下:


@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

public @interface SpringBootApplication{}


1、@SpringBootConfiguration

@Configuration。代表当前是一个配置类

@ SpringBootConfiguration只是Spring标准@Configuration批注的替代方法。 两者之间的唯一区别是@SpringBootConfiguration允许自动找到配置。


2、@ComponentScan

指定扫描哪些,Spring注解;


3、@EnableAutoConfiguration的组合注解如下

@AutoConfigurationPackage

@Import(AutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {}


1、@AutoConfigurationPackage

自动配置包?指定了默认的包规则

@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件

public @interface AutoConfigurationPackage {}

利用Registrar给容器中导入一系列组件

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

默认包扫描原理就在这里体现

使用@import将AutoConfigurationPackages包下的Registrar类作为组件导入到容器中,然后使用Registrar中的方法批量完成组件的注册。


2、@Import(AutoConfigurationImportSelector.class)

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

在这里插入图片描述

文件里面写死了spring-boot一启动就要给容器中加载的所有配置类

spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories

Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\


调用关系及总结

在这里插入图片描述


3.2、按需开启自动配置项


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

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


3.3、修改默认配置


springmvc文件上传功能,下面是springboot默认配置的文件上传功能:

@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;

}

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

下面展示springmvc原生的springmvc.xml中对文件上传功能的.xml配置:


SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先====约定大于配置

@Bean

@ConditionalOnMissingBean

public CharacterEncodingFilter characterEncodingFilter() {

}


总结


  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

  • 生效的配置类就会给容器中装配很多组件

  • 只要容器中有这些组件,相当于这些功能就有了

定制化配置

  • 用户直接自己@Bean替换底层的组件

  • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties


3.4、最佳实践


  • 引入场景依赖—下面的链接是SprigBoot提供的所有启动器

SpringBoot官网展示提供的所有启动器

  • 查看自动配置了哪些,即哪些自动配置生效了,哪些没生效

自己分析,引入场景对应的自动配置一般都生效了

配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)

在这里插入图片描述

  • 是否需要修改相关配置

参照文档修改配置项,springboot官网文档,展示可修改的配置属性

自己分析。xxxxProperties绑定了配置文件的哪些。

自定义加入或者替换组件,用户配置的组件优先===》@Bean、@Component…

自定义器 XXXXXCustomizer


4、开发小技巧

======================================================================

4.1 开发小技巧


简化JavaBean开发

org.projectlombok

lombok

idea中搜索安装lombok插件

在这里插入图片描述

=简化JavaBean开发=====

@NoArgsConstructor

//@AllArgsConstructor

@Data

@ToString

@EqualsAndHashCode

public class User {

private String name;

private Integer age;

private Pet pet;

public User(String name,Integer age){

this.name = name;

this.age = age;

}

}

简化日志开发===

@Slf4j

@RestController

public class HelloController {

@RequestMapping(“/hello”)

public String handle01(@RequestParam(“name”) String name){

log.info(“请求进来了…”);

return “Hello, Spring Boot 2!”+“你好:”+name;

}

最后

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

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

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

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

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

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

public User(String name,Integer age){

this.name = name;

this.age = age;

}

}

简化日志开发===

@Slf4j

@RestController

public class HelloController {

@RequestMapping(“/hello”)

public String handle01(@RequestParam(“name”) String name){

log.info(“请求进来了…”);

return “Hello, Spring Boot 2!”+“你好:”+name;

}

最后

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

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

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

[外链图片转存中…(img-sqMvWoNP-1715070885494)]

[外链图片转存中…(img-R9pAGpP9-1715070885495)]

[外链图片转存中…(img-jkqcOKzI-1715070885495)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值