一、SpringBoot是什么
- 是一个快速开发的框架,能够快速整合第三方框架。
- 整合的基本原理是Maven依赖关系,Maven的集成,完全采用注解化,简化XML配置,内嵌HTTP服务器(Tomcat,jetty),默认嵌入Tomcat,最终以Java应用程序进行执行。
二、为什么要用SpringBoot
- 以往的项目整合起来是比较繁琐复杂的,而且存在架构包冲突的问题。SpringBoot的设计目的就是用来简化Spring应用的创建。
三、SpringBoot的核心功能
1.可独立运行的Spring项目:SpringBoot可以以jar的形式独立运行。
2.内嵌的Servlet容器:SpringBoot可以选择内嵌Tomcat、Jetty或者Undertow,无需以war包形式部署项目。
3.简化Maven配置:Spring提供推荐的基础POM文件来简化Maven配置。
4.自动配置Spring:SpringBoot会根据项目依赖来自动配置Spring,极大地减少项目要使用的配置。
5.提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康查看。
6.无代码生成和xml配:SpringBoot不生成代码。完全不需要任何xml配置即可实现Spring的所有配置。
四、Spring Boot 中的starter
- Spring Boot中的starter只不过是把我们某一个模块,比如web开发时所需要的所有JAR包打包好给我们而已。不过它的厉害之处在于,能自动把配置文件搞好,不用我们手动配置。
五、SpringBoot启动流程
- Springboot启动入口类
@SpringBootApplication
public class SpringBootWebApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringBootWebApplication.class);
application.run(args);
}
}
- 主要有两部分:一个是@ SpringBootApplication以及application.run()。
(1)@ 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 {
}
主要有@Configuration 和 @EnableAutoConfiguration 两个关键的
1)@Configuration:它是JavaConfig形式的SpringIoc容器的配置类使用的那个@Configuration,这里的启动类标注了@Configuration之后,本身其实也是一个Ioc容器的配置类。
2)@EnableAutoConfiguration:简单的说它的作用就是借助@Import的支持,收集和注册特定场景相关的bean定义。
@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的Ioc容器。(借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持很智能的配置)

(2)SpringApplication中run()方法(SpringBoot启动简单流程)
1)实例化SpringApplication
SpringApplication初始化主要做三件事:
- 根据classpath下是否存在(ConfigurableWebApplicationContext)判断是否要启动一个web applicationContext。
- SpringFactoriesInstance加载classpath下所有可用的ApplicationContextInitalizer。
- SpringFactoriesInstance加载classpath下所有可用的ApplicationListener。
2)开始监听SpringApplication的启动
SpringApplication实例化完成并且完成配置后调用run()方法,首先遍历初始化过程中加载的SpringApplicationRunListener,然后调用starting(),开始监听SpringApplication的启动。
3)加载SpringBoot配置环境(ConfigurableEnvironment)
如果是通过web容器发布,会加载StandardEnvironment。将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListener)。
4)banner属性的设置
5)ConfigurableApplicationContext(应用配置上下文)创建
根据webEnvironment是否是web环境创建默认的contextClass,AnnotationConfigEmbeddedWebApplixationContext(通过扫描所有注解类来加载bean)和ConfigurableWebApplicationContext,最后通过BeanUtils实例化上下文对象,并返回。
6)prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
7)refreshContext(context),bean的实例化完成Ioc容器可用的最后一道工序。
六、Spring boot中自动装配机制的原理
1)@SpringBootApplication : 启动类注解

2)@EnableAutoConfiguration:自动配置注解
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)AutoConfigurationImportSelector:自动配置导入类
EnableAutoConfiguration 源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
/**
* Environment property that can be used to override when auto-configuration is
* enabled.
*/
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
4)获取所有装配类并注入到容器中

4-1)SpringFactoriesLoader:加载所有META-INF/spring.factories
AutoConfigurationImportSelector类中最重要的selectImports方法:
获取全部配置类信息,所有配置信息都是从META-INF/spring.factories中获取的
4-2)ImportSelect:生成配置类的bean放入容器中
SpringBoot自动配置是基于约定大于配置思想完成的
七、Springbootapplication注解了解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration//引入EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...//具体参数暂时忽略
}
7-1)@SpringBootConfiguration:@SpringBootConfiguration表示一个类提供 Spring Boot 应用程序@Configuration。
7-2)@EnableAutoConfiguration(自动配置有关的核心注解,主要分析):Spring自动装配
7-3)@ComponentScan(包扫描)(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }):剔除一些扫描文件
备注:
1)@Resource和@Autowired的区别
1-1)来源不同
@Autowired:是 Spring 框架自带的注解,属于 Spring 的核心功能。
包路径:org.springframework.beans.factory.annotation.Autowired。
@Resource:是 Java 标准(JSR-250)提供的注解,属于 Java 的javax.annotation包。
需要依赖 javax.annotation-api(Java 8 及之前)或 jakarta.annotation-api(Java 9+)。
1-2)注入方式不同
@Autowired:默认按类型(byType)注入。根据字段或参数的类型在 Spring 容器中查找匹配的 Bean。
如果存在多个相同类型的 Bean,需要结合 @Qualifier("beanName") 指定名称,否则会抛出 NoUniqueBeanDefinitionException。
支持 required 属性(默认为 true),可以设置为 @Autowired(required=false) 允许注入为 null。
@Resource:默认按名称(byName)注入。先根据字段或属性名查找匹配的 Bean(如字段名为userService,则查找名为userService的 Bean)。
如果名称未找到,则回退到按类型(byType)查找。
可以通过 name 属性直接指定 Bean 名称(如 @Resource(name="myBean")),避免歧义。
1-3)使用场景
@Autowired:适用于需要 按类型注入 的场景,尤其是当依赖的 Bean 名称与字段名不一致时。
需要 Spring 框架支持,适合纯 Spring 项目。支持更灵活的注入方式(如构造方法注入、Setter 注入、字段注入)。
- @Resource:适用于 按名称注入 的场景,尤其是当需要明确指定 Bean 名称时。
依赖 Java 标准,适合需要兼容非 Spring 容器的场景(如 Jakarta EE)。通常用于字段注入或 Setter 方法注入。
更多内容:
Spring篇(1)--SpringBoot是什么?原理是怎么样的?
Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段
本文介绍了SpringBoot框架,一种用于快速开发的工具,能够简化第三方框架的整合过程。SpringBoot利用Maven依赖管理和注解配置,使得项目搭建更为简便。文章详细阐述了SpringBoot的六大核心功能,包括独立运行能力、内置Servlet容器、Maven配置简化等。
7400

被折叠的 条评论
为什么被折叠?



