上一章中我们提到,springboot通过父项目依赖和starter的场景启动器来管理和启动相关组件,以 spring-boot-starter-web 场景管理器为例,它能够为提供 Web 开发场景所需要的几乎所有依赖,因此在使用 Spring Boot 开发 Web 项目时,只需要引入该 Starter 即可,而不需要额外导入 Web 服务器和其他的 Web 依赖。
但我们在启动springboot项目时候,springboot是如何按需加载所需要的自动配置配置项?引入哪些场景,这些场景的自动配置才会开始呢?下面以springboot启动类注解来说明。
1.SpringBoot启动类配置
默认情况下,Spring Boot 项目会创建一个名为 Application 的主程序启动类 ,该类中使用了 @SpringBootApplication来开启 Spring Boot 的自动配置,另外该启动类中包含一个 main() 方法,用来启动该项目。代码如下:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
//2、查看容器中的组件
String[] names =run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
其中 @SpringBootApplication可以使用其核心的三个注解替换,但要指定xxxApplication所在的包路径,代码如下:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.example.demo")//注意,这里要指定DemoApplication所在的包
public class DemoApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
//2、查看容器中的组件
String[] names =run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
通过上述结果可以看到springboot为我们添加好了所有开发中常用的组件,包括自动配置SpringMvC的全套组件如dispatcherServlet、字符编码过滤器characterEncodingFilter、web常用场景组件如beanNameViewResolver等,如下:
自动配置SpringMVC
-
引入SpringMVC全套组件
-
自动配置好SpringMlVC常用组件(功能)
自动配好wWeb常见功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的常见场景
默认的包结构
- 主程序所在目录的包及所有子包里面的组件都会被默认扫描进来。无需以前的包扫描配置
- 要改变扫描路径使用@SpringBootApplication(scanBasePackages=“xxx.xxx”) 或者@ComponentScan(“xxx.xxx”)指定扫描路径
2.启动类注解@SpringBootApplication
上述中springboot为我们添加好了所有开发中常用的组件实现主要取决于@SpringBootApplication注解。@SpringBootApplication注解的作用介绍如下:
@SpringBootApplication 注解是一个组合注解,包含三个核心注解:
· @SpringBootConfiguration
· @EnableAutoConfiguration
· @ComponentScan
@SpringBootApplication 注解标注的类 表明 该类 是 springBoot的 主配置类;
@SpringBootApplication 注解标注的类 中的 main() 方法是 Spring Boo t应用的启动入口;
@SpringBootApplication 能够扫描 Spring组件 并 自动配置Spring Boot。
@SpringBootApplication 注解代码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}
3.注解@ CmponentScan(了解)
@CmponentScan标注用于指定要扫描的包,将哪些包下面的带有实例化注解的类进行扫描,生成组件,交给SpringIOC容器管理。参数是包路径。
如果用在主启动类中,包路径必须是主启动类所在的包,否则扫描不到主启动类,无法启动报错。
4.注解@SpringBootConfiguration
@Configuration是Spring底层的一个注解,使用@Configuration标注的类,说明该类是配置类。
前面内容中提到 @SpringBootApplication 注解标注的类 表明该类 是 springBoot的 主配置类,原因在于 @SpringBootApplication 的三大核心注解之一@SpringBootConfiguration。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}
通过观察发现 @SpringBootConfiguration 是标注在 @SpringBootApplication上面,@SpringBootConfiguration所标注的类说明该类是配置类。因此说明@SpringBootApplication也是配置类。
进入@SpringBootConfiguration注解的中查看源码,如下:
@Target({ElementType.TYPE})
@Retent