Spring篇(1)--SpringBoot是什么?原理是怎么样的?

本文介绍了SpringBoot框架,一种用于快速开发的工具,能够简化第三方框架的整合过程。SpringBoot利用Maven依赖管理和注解配置,使得项目搭建更为简便。文章详细阐述了SpringBoot的六大核心功能,包括独立运行能力、内置Servlet容器、Maven配置简化等。

一、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篇(2)--Spring IOC基本流程原理

Spring篇(3)--Spring Aop基本流程原理

Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段

Spring篇(4-2)--Spring BeanFactory与FactoryBean 区别

Spring篇(5-1)--Spring事务流程原理

Spring篇(5-2)--Spring事务传播行为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun cat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值