SpringBoot三种注解启动方式

本文详细介绍了SpringBoot的三种启动方式:@EnableAutoConfiguration、@EnableAutoConfiguration+@ComponentScan和@SpringBootApplication,解释了它们的工作原理及如何指定扫描范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、SpringBoot内置了Tomcat,Jetty等容器,所以可以通过注解方式进行启动。

2、SpringBoot注解启动的原理:SpringBoot main方法,是程序入口,启动SpringBoot项目,创建内置tomcat服务器,使用tomcat加载springmvc 注解启动。注解的作用是让SpringBooot根据应用所声明的依赖来对Spring框架进行自动配置,这个注解告诉SpringBoot根据添加的jar依赖猜想你向如何配置Spring。由于spring-boot-start-web添加了Tomcat和SpringMVC,所以SpringBoot根据注解将假定你正在开发一个web应用并相应的对Spring进行设置

3、第一种注解启动:@EnableAutoConfiguration

@EnableAutoConfiguration 注解的扫包范围默认是当前类,对其他类不启作用。

4、第二种注解启动:@EnableAutoConfiguration+@ComponentScan

@EnableAutoConfiguration+@ComponentScan 可以根据需求通过@ComponentScan(basePackages={"com.demo1.controller","com.demo2.controller"}),指定@EnableAutoConfiguration的扫包范围

5、第三种注解启动:@SpringBootApplication

@SpringBootApplication 等同于@EnableAutoConfiguration+@ComponentScan,但是@SpringBootApplication默认扫同级包及其子包,不用单独再指定扫包范围。

6、建议:SpringBoot的启动类,一般单独抽取出来,并且保证SpringBoot的启动类所在的包,位于所有包的最上方,作为所有子包的父包。

### Spring Boot 启动过程中的注解加载机制 #### 1. 注解驱动的自动化配置 Spring Boot 利用了 Java 的元数据注解特性,在启动过程中自动扫描并处理各种自定义和内置注解。这使得开发人员可以通过简单的注解声明来启用复杂的功能模块,而无需编写大量的 XML 或者 Java 配置代码[^1]。 ```java @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` `@SpringBootApplication` 是一个组合注解,它包含了 `@Configuration`, `@EnableAutoConfiguration`, 和 `@ComponentScan` 这三个重要的注解: - **`@Configuration`**: 表明该类是一个配置类,允许使用基于Java的Bean定义。 - **`@EnableAutoConfiguration`**: 自动配置的核心所在,能够根据项目的依赖关系推断出合理的默认设置,并尽可能减少手动配置的工作量。 - **`@ComponentScan`**: 开启组件扫描功能,默认情况下会在当前包及其子包下查找带有 `@Component` 及其衍生注解(如 `@Service`, `@Controller`, `@Repository`)标记的 Bean 定义。 #### 2. 类路径下的注解处理器注册 当创建 `SpringApplication` 实例时,框架内部会执行一系列初始化操作,其中包括向容器中注入多个事件监听器和服务提供者接口 (SPI),其中就涉及到了对各类注解的支持服务。特别是对于那些实现了 `ApplicationContextInitializer` 接口的服务提供商来说,它们可以在上下文刷新之前介入到应用生命周期当中去完成一些必要的准备工作,比如解析某些特殊类型的注解信息[^2]。 #### 3. 条件化装配与条件判断支持 为了更好地适应不同的运行环境以及满足多样化的业务需求,Spring Boot 提供了一套灵活多变的条件评估工具集——即所谓的 "条件化装配" 功能。借助于诸如 `@ConditionalOnClass`, `@ConditionalOnMissingBean`, `@Profile` 等条件型注解的帮助,可以根据实际场景动态决定哪些 Beans 应被纳入最终的应用程序上下文中;与此同时,还存在像 `EnvironmentPostProcessor` 这样的扩展点用于进一步增强这种灵活性[^3]。 #### 4. Web MVC 相关注解识别 如果项目选择了构建Web应用程序,则还会涉及到更多专门针对HTTP请求映射等方面的注解处理逻辑。例如,`@RestController` 和 `@RequestMapping` 就是用来简化RESTful API开发的关键字之一。前者用来指示某个类作为控制器角色参与路由分发任务,后者则负责指定具体的URL模式匹配规则以便正确转发给相应的方法进行响应生成。 ```java @RestController @RequestMapping("/api/v1") public class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello World!"; } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值