一、容器功能

1.1 组件添加

1. @Configuration

  1. Full模式:获取对象时,首先在容器内搜索是否存在,如存在直接拿出
  • 默认为Full模式,单例
  • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
@Configuration(proxyBeanMethods = true)
  1. 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

步骤:

  1. 在MyConfig中添加@EnableConfigurationProperties
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}
  1. 在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替换底层的组件(用户优先)
    • 用户去看这个组件是获取的配置文件什么值就去修改。(修改配置文件)

三、最佳应用

四、开发小技巧

4.1 lombok

==================导入依赖===============
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
  1. 简化javaBean开发
=================添加注解=================
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参数构造
@Data//引入get,set,toString方法
public class User {
private String name;
private int age;
private Pet pet;
}
  1. 简化日志开发
@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)的更多相关文章

  1. SpringBoot笔记十六:ElasticSearch

    目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...

  2. SpringBoot笔记一

    1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库 ...

  3. 【SpringBoot笔记】SpringBoot整合Druid数据连接池

    废话少说,按SpringBoot的老套路来. [step1]:添加依赖 <!-- 数据库连接池 --> <dependency> <groupId>com.alib ...

  4. SpringBoot笔记十七:热部署

    目录 什么是热部署 Devtools热部署 什么是热部署 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 举个例子,王者荣耀的更新有时候就是热部署,热更新,就是他提示你更新,更新40 ...

  5. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

  6. SpringBoot笔记十三:引入webjar资源和国际化处理

    目录 什么是webjar 怎么使用webjar 国际化 新建国际化配置文件 配置配置文件 使用配置文件 我们先来看一个html,带有css的,我们就以这个为准来讲解. 资源可以去我网盘下载 链接:ht ...

  7. springboot笔记1(转载于puresmile)

    构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  8. SpringBoot笔记

    官网: http://springboot.fun/ 收集到一个比较全的: https://blog.csdn.net/xiaoyu411502/article/details/52474037 Id ...

  9. springboot笔记05——profile多环境配置切换

    前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要 ...

  10. springboot笔记09——使用aop

    什么是AOP? aop(Aspect Oriented Programming)面向切面编程,是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装 ...

随机推荐

  1. C++第五十篇 -- 获取串口的描述信息

    如何知道自己的电脑上有无串口呢? -- 手动 1. 查看电脑,看是否有串口器件(串口是一个九针的D型接口) 2. 在设备管理器上查看 乍一看,还以为是有两个串口,其实仔细看描述就知道,这是蓝牙虚拟串口 ...

  2. C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)

    在上一篇博客:C#曲线分析平台的制作(三,三层构架+echarts显示)中已经完成了后台的三层构架的简单搭建,为实现后面的拓展应用开发和review 改写提供了方便.而在曲线分析平台中,往往有要求时间 ...

  3. C# Get和Post请求接口类

    public class HttpHelper {/// <summary> /// Get请求 /// </summary> /// <param name=" ...

  4. Distance Queries 距离咨询 (LCA倍增模板)

    农夫约翰有N(2<=N<=40000)个农场,标号1到N.M(2<=M<=40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地 ...

  5. 给每个li延时添加样式动画效果(setInterval,clearInterval)

    btnsAnime($('ul li')) function btnsAnime(pagesl) { var that = this $(pagesl).hide() let i = 0; funct ...

  6. 6轮面试辛苦拿到阿里Android开发offer,却从22k降到15k,在逗我?

    一小伙工作快3年了,拿到了阿里云Android开发岗位P6的offer,算HR面一起,加起来有6轮面试了,将近3个月的时间,1轮同级 + 1轮Android用人部门leader + 1轮Android ...

  7. 三年Android开发,竟只会增删改查,被面试官一顿怼!

    最近看到某公司面试官发的这样一个帖子: 我面试了一个有三年Android开发经验的小伙子,也是我有史以来给别人面试时间最短的一次,不到十分钟就结束了,原因很简单,底子太差只会curd,很多技术性的问题 ...

  8. k8s之Service详解-Service使用

    实验环境准备 在使用service之前,首先利用deployment创建出3个pod,注意要为pod设置app=nginx-pod的标签 创建deployment.yaml,内容如下 apiVersi ...

  9. Kali2搭建Metasploitable3靶机

    Metasploitable3简介 Metasploitable3是Metasploitable2的升级版本,它是一个虚拟靶机系统,里面含有大量未被修复的安全漏洞,它主要是用于metasploit-f ...

  10. DL基础补全计划(六)---卷积和池化

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...