SpringBoot笔记(2)
一、容器功能
1.1 组件添加
1. @Configuration
- Full模式:获取对象时,首先在容器内搜索是否存在,如存在直接拿出
- 默认为Full模式,单例
- 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
@Configuration(proxyBeanMethods = true)
- Lite模式:获取对象时,直接创建新对象
- 多例
- 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
@Configuration(proxyBeanMethods = false)
配置类编写
- @Configuration
- @Bean
//告诉SpringBoot这是一个配置类
@Configuration
public class MyConfig {
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
zhangsan.setPet(pet01());
return zhangsan;
}
@Bean
public Pet pet01(){
Pet tom = new Pet("tom");
return tom;
}
}
2. @Bean、@Component、@Controller、@Service、@Repository
3. @ComponentScan、@Import
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
4. @Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
由于User依赖Pet,所以当pet组件不存在时,user组件也没有意义,所以使用条件装配@ConditionalOnBean
//存在pet01组件则进行组件注入
@ConditionalOnBean(name = "pet01")
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
zhangsan.setPet(pet01());
return zhangsan;
}
1.2 原生配置文件引入
1. @ImportResource
作用:已经在xml中配置了组件,让配置文件中的内容生效
@ImportResource("classpath:beans.xml")
public class MyConfig {}
1.3 配置绑定@ConfigurationProperties
类似于jdbc的xml中数据绑定,可以使用@ConfigurationProperties
方法一:@EnableConfigurationProperties + @ConfigurationProperties
步骤:
- 在MyConfig中添加@EnableConfigurationProperties
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}
- 在pojo的实体类上添加@ConfigurationProperties
mycar.name=BYD
mycar.price=1000
prefix表示xml文件中的前缀
@ConfigurationProperties(prefix = "mycar")
public class Car {
方法二:@Component + @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
二、自动配置原理入门
2.1 引导加载自动配置类(注解)
@SpringBootApplication = @SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
1. @SpringBootConfiguration
@Configuration。代表当前是一个配置类
2. @ComponentScan
指定扫描哪些,Spring注解;
3. @EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage:
自动配置包?指定了默认的包规则
@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一启动就要给容器中加载的所有配置类
2.2 按需开启自动配置项
虽然127个自动配置启动时都加载了(xxxAutoConfiguration),但会按照条件装配规则@Conditional,进行按需装配
2.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;
}
将用户的不规范的命名进行重命名
2.4 总结
- SpringBoot首先会加载所有的自动配置类
- 每个自动配置类按条件进行生效
- 大多数自动配置类默认会绑定配置文件
- 生效的配置类就会给容器中装配很多组件
- SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
顺序:
首先加载自动配置类------>按条件生效的自动配置类----->寻找配置文件------->根据配置文件的数据为容器添加组件(用户优先)
定制化配置
- 用户直接自己@Bean替换底层的组件(用户优先)
- 用户去看这个组件是获取的配置文件什么值就去修改。(修改配置文件)
三、最佳应用
引入场景依赖
查看自动配置了哪些(选做)
- 自己分析,引入场景对应的自动配置一般都生效了
- 配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)
是否需要修改
- 参照文档修改配置项
- 自定义加入或者替换组件
- @Bean、@Component。。。
- 自定义器 XXXXXCustomizer;
- ......
四、开发小技巧
4.1 lombok
==================导入依赖===============
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 简化javaBean开发
=================添加注解=================
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参数构造
@Data//引入get,set,toString方法
public class User {
private String name;
private int age;
private Pet pet;
}
- 简化日志开发
@Slf4j
public class HelloController {
@RequestMa
4.2 dev-tools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
项目或者页面修改以后:Ctrl+F9;
4.3 Spring Initailizr(项目初始化向导)

会自动进行依赖导入,自动创建项目结构,自动配好主配置类
SpringBoot笔记(2)的更多相关文章
- SpringBoot笔记十六:ElasticSearch
目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...
- SpringBoot笔记一
1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库 ...
- 【SpringBoot笔记】SpringBoot整合Druid数据连接池
废话少说,按SpringBoot的老套路来. [step1]:添加依赖 <!-- 数据库连接池 --> <dependency> <groupId>com.alib ...
- SpringBoot笔记十七:热部署
目录 什么是热部署 Devtools热部署 什么是热部署 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 举个例子,王者荣耀的更新有时候就是热部署,热更新,就是他提示你更新,更新40 ...
- SpringBoot笔记十四:消息队列
目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...
- SpringBoot笔记十三:引入webjar资源和国际化处理
目录 什么是webjar 怎么使用webjar 国际化 新建国际化配置文件 配置配置文件 使用配置文件 我们先来看一个html,带有css的,我们就以这个为准来讲解. 资源可以去我网盘下载 链接:ht ...
- springboot笔记1(转载于puresmile)
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- SpringBoot笔记
官网: http://springboot.fun/ 收集到一个比较全的: https://blog.csdn.net/xiaoyu411502/article/details/52474037 Id ...
- springboot笔记05——profile多环境配置切换
前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要 ...
- springboot笔记09——使用aop
什么是AOP? aop(Aspect Oriented Programming)面向切面编程,是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装 ...
随机推荐
- webpack 安装使用简例
1. 新建项目文件夹,如 webpack-demo 2. cd 到安装项目根目录,即进入webpack-demo文件夹,命令行工具输入"npm install webpack webpack ...
- PGSQL基础语句汇总
一.pgsql里面的数据类型不再介绍:https://www.runoob.com/postgresql/postgresql-data-type.html 二.常用基本语句 2.1.CREATE D ...
- 流暢的python---函數闭包
一.函数的定义及其应用所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤1.定义函数–封装独立的功能2.调用函数–享受封装的成果函数的作用:在开发时,使用函 ...
- [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice
[源码解析] 机器学习参数服务器ps-lite 之(1) ----- PostOffice 目录 [源码解析] 机器学习参数服务器ps-lite 之(1) ----- PostOffice 0x00 ...
- 监控实战之Prometheus
author:JevonWei 版权声明:原创作品 目录 一 背景 二 部署Prometheus Server Prometheus 主配置文件 targets 节点配置文件 rules 告警规则 运 ...
- 小技巧 | Get 到一个 Web 自动化方案,绝了!
1. 前言 大家好,我是安果! 无论是 Chrome,还是 Firefox 浏览器,它们的强大性在很大程度上都是依赖于海量的插件,让我们能高效办公 那我们是否可以编写一个插件,让浏览器自动化完成一些日 ...
- 遥远的国度 (树链剖分换根),洛谷P3979
析:显然,若没有换根操作,则为树链剖分板子题,但是这道题我们考虑换根操作 考虑这样一个性质:在一棵树上,两点的距离路径是唯一的!! 也就是说,我们在修改路径上的点权时,不必考虑根在哪里,直接利用模板修 ...
- 如何从二维平面n个点中寻找距离最近两个点?
如何理解分治算法 什么是分治算法?简单来说就是"分而治之",也就是将原问题划分成n个规模较小的,并且结构与原问题相似的子问题,然后去递归地解决这些子问题,最后再合并其结果,就得到原 ...
- 面试必备:Android Activity启动流程源码分析
最近大致分析了一把 Activity 启动的流程,趁着今天精神状态好,把之前记录的写成文章. 开门见山,我们直接点进去看 Activity 的 startActivity , 最终,我们都会走到 st ...
- tomcat启动时启动窗口出现乱码一招搞定
先来看看问题(图示),在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码,虽然这些对tomcat本身的使用没有任何影响,但却非常碍眼,影响视觉效果! tomcat启动时启动窗口出现乱码的解决 ...