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
条件装配:满足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);
}
===========================================================================
将原生的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
=======================================================================
如何使用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.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,\
…
调用关系及总结
虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。
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
- 引入场景依赖—下面的链接是SprigBoot提供的所有启动器
- 查看自动配置了哪些,即哪些自动配置生效了,哪些没生效
自己分析,引入场景对应的自动配置一般都生效了
配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)
- 是否需要修改相关配置
参照文档修改配置项,springboot官网文档,展示可修改的配置属性
自己分析。xxxxProperties绑定了配置文件的哪些。
自定义加入或者替换组件,用户配置的组件优先===》@Bean、@Component…
自定义器 XXXXXCustomizer
======================================================================
简化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开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
分享
首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:
(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
其次分享一些技术知识,以截图形式分享一部分:
Tomcat架构解析:
算法训练+高分宝典:
Spring Cloud+Docker微服务实战:
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
Java高级架构面试知识整理:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
]
[外链图片转存中…(img-pbVaus9w-1713403290464)]
[外链图片转存中…(img-Cqr0qyPG-1713403290465)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
分享
首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:
(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
其次分享一些技术知识,以截图形式分享一部分:
Tomcat架构解析:
[外链图片转存中…(img-I6VboT1n-1713403290465)]
算法训练+高分宝典:
[外链图片转存中…(img-k9juSIDr-1713403290465)]
Spring Cloud+Docker微服务实战:
[外链图片转存中…(img-D7PYC1iD-1713403290466)]
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
[外链图片转存中…(img-XORMDZXI-1713403290466)]
Java高级架构面试知识整理:
[外链图片转存中…(img-5JSqbMRk-1713403290466)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!