springboot

快速开始

1
2
3
4
5
6
7
8
9
10
11
12
<!--在pom.xml文件中写入-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
7
//创建一个主启动类,并在类名上加上 @SpringBootApplication注解
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class)
}
}
1
2
3
4
5
6
7
8
9
// 创建controller
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/hello")
public String helloHandle(){
return "hello world!"
}
}
1
2
# 创建application.properties文件
server.port = 8080 #tomcat端口
1
2
3
4
5
6
7
8
9
<!--在pom.xml文件中写入-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

依赖管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!--springboot项目中引入父工程spring-boot-starter-parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>

<!--spring-boot-starter-parent项目中引入父工程spring-boot-dependencies-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>

<!--spring-boot-dependencies项目中控制了各种依赖的版本号-->
<properties>
<activemq.version>5.15.13</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.82</appengine-sdk.version>
...
...
...
</properties>

<!--要想控制自定义版本号,在pom.xml文件中配置-->
<properties>
<xxx.version>自定义版本号</xxx.version>
</properties>


<!--可以直接引入各种starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

自动注入

主程序同级目录下以及同级目录下的子包会自动被扫描

@SpringBootApplication 等同于

@SpringBootConfiguration、

@EnableAutoConfiguration、

@ComponentScan(“com.kuang”)

各种配置有默认值

  • 默认配置都是映射到相应xxxProperties类中
  • 配置文件中的值会绑定到某个类上,这个类会在容器中创建对象

按需配置

  • 引入各不同starter,例如spring-boot-start-web引入spring-boot-start,而spring-boot-start中引入spring-boot-autoconfigure依赖

注解详解

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration //告诉springboot这是一个配置类 == 配置文件
public class MyConfig {

/* 给容器添加组件。
* 方法名作为组件id。
* 返回类型就是组件类型,
* 返回值就是组件在容器的实例
*/
@Bean
public User user01(){
return new User("张三",18);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration(proxyBeanMethods = true)
代理模式 默认为true,保证springboot容器中是但实例
如果值为false,则就可以创建多个实例

@Import({xxx.class,xxx.class}) 给容器中添加组件

@ConditionalOnBean() 条件装配

@ImportResource() 可以导入传统的xml文件

@ConfigurationProperties(prefix = ) 和配置文件绑定

@EnableConfigurationProperties(xxx.class)
1、 开启这个类配置绑定功能
2、 把这个类自动注入到容器中

只有在容器中的组件,才会有SpringBoot的强大功能

1
2
3
4
5
@Bean javaBean对象
@Component 组件
@Controller 控制器
@Service 业务逻辑组件
@Repository 数据库

自动配置原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SpringBootConfiguration 继承Configuration,表示@SpringBootApplication也是一个配置类

@ComponentScan 包扫描注解

@EnableAutoConfiguration 继承@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage(自动配置包)继承@Import(AutoConfigurationPackage.Registrar.class)
利用Registrar给容器导入一系列组件,将指定的一个包下的所有组件导入(主启动类)
@Import(AutoConfigurationImportSelector.class)
1、AutoConfigurationImportSelector类中selectImports方法中getAutoConfigurationEntry(annotationMetadata)获取所有自动配置的集合
2、getAutoConfigurationEntry调用 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) 获取所有需要导入容器的配置类
3、利用工厂加载Map<String,List<String>>loadSpringFactories(@Nullable ClassLoader classLoader)得到所有组件
4、从META-INF/spring.factories位置来加载一个文件
默认扫描我们当前系统所有META-INF/spring.factories位置的文件
spring-boot-autoconfig-2.3.4.RELEASE.jar也有META-INF/spring.factories文件

总结

  • Springboot先加载所有自动配置类 xxxAutoConfiguration
  • 每个自动配置类按照条件生效,默认都会绑定配置文件指定的值,xxxProperties里面,xxxProperties有和配置文件进行了绑定
  • 生效的配置类会给容器中装配很多组件
  • 定制话组件
    • 用户直接@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值,取配置文件修改

xxxAutoConfiguration–>组件–>xxxProperties取值–>application.properties

dev-tools

1
2
3
4
5
6
7
8
<!--热更新技术,之后就可以ctrl + F9进行热更新-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

自定义类绑定配置提示

1
2
@ConfigurationProperties(prefix = "person")
//在类的前面添加这个注解可以绑定yml配置文件前缀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 打包的时候不用打包这个插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configurationprocessor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>