SpringBoot2学习笔记
一、SpringBoot2基础入门
二、自动配置原理
2.1)SpringBoot特点
2.1.1)依赖管理
父项目做依赖管理
<!--依赖管理-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<!--它的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<!--其中几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制-->
可以修改默认版本号
<!--1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key-->
<!--2、在当前项目里面重写配置-->
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
开发导入starter场景启动器
<!--
1、见到很多 spring-boot-starter-* : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
5、所有场景启动器最底层的依赖
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
-
无需关注版本号,自动版本仲裁
1、引入依赖默认都可以不写版本
2、引入非版本仲裁的jar,要写版本号
2.1.2)自动配置
自动配好Tomcat --> 引入Tomcat依赖,配置Tomcat
<!--
1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
2、在当前项目里面重写配置
-->
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
-
自动配好SpringMVC
引入SpringMVC全套组件并自动配好SpringMVC常用组件(功能)
-
自动配好Web常见功能,如:字符编码问题
SpringBoot帮我们配置好了所有web开发的常见场景;
-
默认的包结构
-
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,无需以前的包扫描配置;
-
想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.study") 或者@ComponentScan 指定扫描路径,如下:
//主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
@SpringBootApplication
// 修改扫描路径方案一:
//@SpringBootApplication(scanBasePackages="com.study")
// 修改扫描路径方案二:添加下列三个注解代替@SpringBootApplication
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.study")
-
各种配置拥有默认值
-
默认配置最终都是映射到某个类上,如:MultipartProperties
-
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
-
按需加载所有自动配置项
-
非常多的starter
-
引入了哪些场景这个场景的自动配置才会开启
-
SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面,如下图:
2.2)容器功能
2.2.1)组件添加
修改SpringBootDemo1工程中的POM.xml文件,添加lombok,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
新建实体类 Pet.java,代码如下:
@ToString
@Data
@NoArgsConstructor //无参构造器
@AllArgsConstructor //全参构造器
public class Pet {
private String name;
}
新建实体类 User.java,代码如下:
@NoArgsConstructor
@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;
}
}
2.2.1.1)@Configuration
新建配置类 MyConfig.java,代码如下:
@Configuration
public class MyConfig {
//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
@Bean
public User user01() {
User zhangsan = new User("zhangsan", 18);
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet() {
return new Pet("tomcat");
}
}
上述代码中:
-
配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
-
配置类本身也是组件
修改主程序启动类MainApplication.java,代码如下:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// 默认启动
// SpringApplication.run(MainApplication.class, args);
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (Strin