自动配置
通过上节的 HelloWorld,可以体会到,SpringBoot 帮我们配置好了以下这些:
自动配好 Tomcat
- 引入 Tomcat 依赖(引入 spring-boot-starter-web 开发场景,就默认引入了 Tomcat 场景);
- 配置 Tomcat。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.5.RELEASE</version>
<scope>compile</scope>
</dependency>
自动配好 SpringMVC
- 引入 SpringMVC 开发的全套组件(引入 spring-boot-starter-web 开发场景,就默认引入了 spring-web、spring-webmvc 场景);
- 自动配好了 SpringMVC 常用组件(功能)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.10.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
<scope>compile</scope>
</dependency>
自动配好 Web 常见功能
- SpringBoot 帮我们配置好了所有 Web 开发的场景场景。
- 在 main 代码片段里,选择一个表达式 SpringApplication.run(MainApplication.class, args),Ctrl-Alt-V(Refactor->Introduce Variable)帮助简化代码中复杂的声明;
- dispatcherServlet 组件、characterEncodingFilter(字符标码拦截器解决字符乱码问题)、ViewResolver(视图解析器)、multipartResolver(文件上传解析器)
- 在 main 代码片段里,选择一个表达式 SpringApplication.run(MainApplication.class, args),Ctrl-Alt-V(Refactor->Introduce Variable)帮助简化代码中复杂的声明;
public class MainApplication {
public static void main(String[] args){
//1.返回我们 IOC 容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//固定写法,Spring应用把主类跑起来
//2.容器里面包含我们当前应用的所有组件,查看容器里边的组件,只要有我们这个组件,说明这个组件就能工作,这就是原理
String[] names = run.getBeanDefinitionNames();//获取所有我们组件定义的名字;
for (String name : names) {
System.out.println(name);
}
}
}
默认的包结构
- 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来;
- 无需以前的包扫描配置;
- 若不将其他程序(WorldController)和主程序放在一起,还想运行成功,方法1:就要修改 @SpringBootApplication,改变扫描路径,使扫描包的层级放大,即:@SpringBootApplication(scanBasePackages = “com.cky”) ;方法2:或者使用@ComponentScan包扫描,来指定扫描路径。
方法 1
//来指定扫描的基础包就是com.cky,也就是将整个包层级放大一点,让它来进行扫描
@SpringBootApplication(scanBasePackages = "com.cky")
public class MainApplication {
public static void main(String[] args){
//1.返回我们 IOC 容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//固定写法,Spring应用把主类跑起来
//2.容器里面包含我们当前应用的所有组件,查看容器里边的组件,只要有我们这个组件,说明这个组件就能工作,这就是原理
String[] names = run.getBeanDefinitionNames();//获取所有我们组件定义的名字;
for (String name : names) {
System.out.println(name);
}
}
}
方法 2
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.cky.boot")
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.cky")
public class MainApplication {
public static void main(String[] args){
SpringApplication.run(MainApplication.class, args);//固定写法,Spring应用把主类跑起来
}
}
各种配置拥有默认值
- 默认配置最终都是映射到某个类上,如:MultipartProperties
- 配置文件的值最终会绑定在某个类上,这个类会在容器中创建对象
- 修改默认值,在 application.properties 中修改
按需加载所有自动配置项
- 非常多的 starter
- 引入了哪些场景,哪些场景的自动配置才会开启
- SpringBoot 所有的自动配置功能都在 spring-boot-autoconfigure 包里面