SpringBoot入口类和@SpringBootApplication讲解

目录
  • 入口类和@SpringBootApplication
    • @ComponentScan相关使用
    • @EnableAutoConfiguration
    • 关闭自动配置
    • 为什么是SpringBoot
  • SpringBoot主程序类,主入口类
    • 主程序类,主入口类

入口类和@SpringBootApplication

SpringBoot项目创建完成之后默认会生成一个*Application的入口类,通过该类的main方法即可启动SpringBoot项目。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringbootRunApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootRunApplication.class, args);
    }
}

在此入口类中,我们可以看到SpringBoot创建的业务代码中(除单元测试)唯一的一个注解——@SpringBootApplication,这也是SpringBoot的核心注解。

源代码如下:

@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 {
    /**
     * 根据类排除不使用的自动配置
     */
    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class<?>[] exclude() default {};
    /**
     * 根据类名排除不使用的自动配置
     */
    @AliasFor(annotation = EnableAutoConfiguration.class)
    String[] excludeName() default {};
    /**
     * 指定扫描的包
     */
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
    /**
     * 指定扫描的类
     */
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};
}

该注解自身为我们提供了四个可配置项:

  • exclude:根据类排除不使用的自动配置;
  • excludeName:根据类名排除不使用的自动配置;
  • scanBasePackages:扫描指定的包;
  • scanBasePackageClasses:扫描指定的类;

@SpringBootApplication组合了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,因此我们也可以直接使用这三个注解来替代它。

在早期版本并没有@SpringBootConfiguration,之后使用了@SpringBootConfiguration并在其中组合了@Configuration注解。在@EnableAutoConfiguration注解中组合了@AutoConfigurationPackage。

@ComponentScan相关使用

@ComponentScan用来指定扫描的组建所在的包路径或class文件。在不指定参数的时候,SpringBoot的@ComponentScan默认会扫描同目录及同目录下级目录的类文件。通过部分源码我们可以明确的看到。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
  
    @AliasFor("basePackages")
    String[] value() default {};
    @AliasFor("value")
    String[] basePackages() default {};
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    String resourcePattern() default “**/*.class";
    // 省略掉部分源码
}

上面的源码重点看一下属性resourcePattern的默认值“**/*.class”,可以看出,如果不指定其他参数的话,默认会去寻找同级目录下的class。

在构造SpringBoot项目时,往往会出现这样一种情况:因为忘记或不知道SpringBoot默认扫描的路径,随意创建包和类的位置,导致项目启动之后,无法实例化对应的组建,无法正确访问接口。

当然,如果是有意为之,那么我们就可以使用@SpringBootApplication或@ComponentScan来指定一些特殊的需要实例化的包或类。

@SpringBootApplication(scanBasePackages = “com.secbro2.controller")
// 或
@ComponentScan(basePackages = "com.secbro2.controller")

@EnableAutoConfiguration

@EnableAutoConfiguration让SpringBoot可以根据类路径中的jar包依赖可以为项目进行一些自动配置。这也是SpringBoot最核心的功能。当然,前提条件是依赖需要按照starter的规则来构建。

比如,我们添加了web的starter,那么SpringBoot就会自动添加Tomcat和SpringMVC的依赖,然后又会进行一些相应的默认配置。但有些依赖需要我们自己去配置一些内容,比如虽然引入了data-jpa的starter,但是如果我们不配置对应的数据源,程序肯定没办法正常启动。

关闭自动配置

自动配置有它的便捷之处,但在某些情况下,我们可能并不需要一些自动配置。比如,虽然引入了data-jpa的依赖,但此刻并不需要连接数据库。那么,就可以通过注解将此自动配置进行关闭。@SpringBootApplication为我们提供了相应的功能。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

为什么是SpringBoot

面试中可能会被问到:为什么我们要使用SpringBoot?

你可能会说:因为SpringBoot用java配置替代了xml配置,或因为它内置Tomcat,可以直接打成jar包,通过java -jar快速启动等;但这都不是重点,重点是刚刚说的@EnableAutoConfiguration实现的功能:自动配置。基于编程的一个共识:约定优于配置。这也正是SpringBoot的核心。

回想一下,在使用SpringBoot的过程中,当用到某个组件,只需引入相应的依赖(starter)。此时SpringBoot已经帮我们把相关的依赖引入,配置好最基本的参数。然后我们根据需要再在application.yml文件中配置一些明确的参数(比如:数据库地址、用户名等),就完成了一个组件的集成,可以专注业务代码的编写了。

SpringBoot主程序类,主入口类

主程序类,主入口类

/**
 * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}
  • @SpringBootApplication:Spring Boot应用标注在某个雷尚说明这个类是Spring Boot的主配置类,Spring Boot就应该允许这个类的main方法来启动SpringBoot应用;
  • @SpringBootConfiguration:SpringBoot的配置类;表追在某个类上,标识这是一个SpringBoot的配置类@Configuration: 配置雷尚来标注这个注解

配置类----配置文件;配置类也是容器中的一个组件;@Component

  • @EnableAutoConfiguration:开启自动配置功能,以前我们需要配置的东西,SpringBoot开启自动配置功能;这样自动配置才能生效;
  • @AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class);

Spring的底层注解@import,给容器中导入一个组件;导入 的组件由AutoConfigurationPackages.Registrar.class

将主配置类(@SpringBootApplication标注的类)的所有包及下面所有组件扫描到Spring容器;

@Import(AutoConfigurationPackages.Registrar.class);

给容器中导入组件

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot启动类@SpringBootApplication注解背后的秘密

    在用SpringBoot的项目的时候,会发现不管干什么都离不开启动类,他是程序唯一的入口,那么他究竟为我们做了什么?本篇文章主要解析@SpringBootApplication. 一.启动类 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } } 二.@SpringBoo

  • SpringBoot核心@SpringBootApplication使用介绍

    目录 @SpringBootApplication的使用 1. Spring Boot 的核心 1.2 关闭自动配置 @SpringBootApplication及pom讲解 @SpringBootApplication 主要有以下注解组成 @SpringBootConfiguration @EnableAutoConfiguration 开启自动配置功能 Spring启动器 SpringBoot 场景启动器 @SpringBootApplication的使用 1. Spring Boot 的核

  • 关于@SpringBootApplication与@SpringBootTest的区别及用法

    目录 @SpringBootApplication与@SpringBootTest区别用法 1 @SpringBootApplication 注解的应用 2 @SpringBootTest 注解的应用 3 @SpringBootApplication 和 @SpringBootTest 的区别 4 @ComponentScan(包含了两个filter) 解析 5 @EnableAutoConfiguration 注解解析 6 @…Test 注解 SpringBootTest对比SpringBoo

  • @SpringBootApplication注解的使用

    一.前言 大部分的配置都可以用Java类+注解来代替,而在SpringBoot项目中见的最多的莫过于@SpringBootApplication注解了,它在每个SpringBoot的启动类上都有标注. 这个注解对SpringBoot的启动和自动配置到底有什么样的影响呢?本文将为各位大佬解析它的源码,揭开@SpringBootApplication注解神秘的面纱. 二.正文 对SpringBoot工程的自动配置很感兴趣,于是学习其源码并整理了其中一些内容,如果有错误请大家指正~话不多说,直接上源码

  • SpringBoot入口类和@SpringBootApplication讲解

    目录 入口类和@SpringBootApplication @ComponentScan相关使用 @EnableAutoConfiguration 关闭自动配置 为什么是SpringBoot SpringBoot主程序类,主入口类 主程序类,主入口类 入口类和@SpringBootApplication SpringBoot项目创建完成之后默认会生成一个*Application的入口类,通过该类的main方法即可启动SpringBoot项目. @SpringBootApplication(exc

  • SpringBoot启动过程逐步分析讲解

    springboot启动是通过一个main方法启动的,代码如下 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 从该方法我们一路跟进去,进入SpringApplication的构造函数,我们可以看到如下代码primarySources,为我们从run方法塞进来的

  • SpringBoot MainApplication类文件的位置详解

    目录 MainApplication类文件的位置 一定要注意启动类的存放位置 MainApplication类文件的位置 搭建 SpringBoot 项目时有一个主程序入口类. 这个 MainApp 类必须在放在整个项目的最根目录,Spring 在扫描注解的时候是扫描这个文件所在包以下的所有Class, 如果其他类放在了高于这个类或其他目录下就会扫描不到 import org.springframework.boot.SpringApplication; import org.springfra

  • SpringBoot普通类获取spring容器中bean的操作

    前言 在spring框架中,是无法在普通类中通过注解注入实例的,因为sping框架在启动的时候,就会将标明交给spring容器管理的类进行实例化,并梳理他们彼此的依赖关系,进行注入,没有交给spring容器管理的普通类,是不会进行注入的,即使你使用了注入的相关注解.这个时候,如果我们需要在普通类中获取spring容器中的实例,就需要一些特定的方法,这里将整理一下如何在springboot中实现这样的方法. 创建springboot工程demo 项目结构图示 项目结构说明 service包下为de

  • 详解SpringBoot启动类的扫描注解的用法及冲突原则

    背景 SpringBoot 启动类上,配置扫描包路径有三种方式,最近看到一个应用上三种注解都用上了,代码如下: @SpringBootApplication(scanBasePackages ={"a","b"}) @ComponentScan(basePackages = {"a","b","c"}) @MapperScan({"XXX"}) public class XXApplic

  • springboot与springmvc基础入门讲解

    目录 一,SpringBoot –1,概述 –2,用法 二,SpringMVC –1,概述 –2,原理 –3,入门案例 总结 一,SpringBoot –1,概述 用来整合maven项目,可以和Spring框架无缝衔接. –2,用法 –1,创建SpringBoot工程:File-New-Project-选择Spring Init--next-输入groupId.项目id.选成jdk8-next-选择SpringWeb-ok –2,配置Maven:File-Settings-选择Build--Ma

  • Java之SpringBoot集成ActiveMQ消息中间件案例讲解

    ActiveMQ是Apache提供的开源组件,是基于JMS标准的实现组件.下面将利用SpringBoot整合ActiveMQ组件,实现队列消息的发送与接收. 第一步:引入依赖 第二步:修改application.yml文件,进行ActiveMQ的配置 第三步:定义消息消费监听类 第四步:定义消息生产者业务接口 第五步: 定义消息业务实现类 第六步:定义JMS消息发送配置类   第七步:测试发送消息 查看结果: 本文采用ActiveMQ实现了消息的发送与接收处理.每当有消息接收到时,都会自动执行M

  • SpringBoot 普通类调用Bean对象的一种方式推荐

    目录 SpringBoot 普通类调用Bean对象 SpringBoot 中bean的使用 SpringBoot 普通类调用Bean对象 有时我们有一些特殊的需要,可能要在一个不被Spring管理的普通类中去调用Spring管理的bean对象的一些方法,比如一般SpringMVC工程在controller中通过 @Autowired private TestService testService; 注入TestService 接口就可以调用此接口实现类的实现的方法. 但在一般类中显然不可以这么做

  • C++ Cartographer的入口node main详细讲解

    目录 Run函数 读取配置参数 构建地图构建器 Node类的初始化 开始轨迹与结束轨迹 啃一下谷歌优秀的激光SLAM开源框架-Cartographer. 这个框架算法简单,但是程序部分太多需要学习的地方了.不论是整体框架的结构,还是数据的使用,都是非常优美的.不愧是大公司啊.接下来记录一下每天学习的内容和心得,督促自己坚持下去! node_main.cc是整个Cartographer程序的入口,用来调用整个Cartographer进程.以最基础的单线雷达和轮速计为例. 整体的代码开始是在Run函

随机推荐