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

网友投稿 278 2023-02-15

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

在用SpringBoot的项目的时候,会发现不管干什么都离不开启动类,他是程序唯一的入口,那么他究竟为我们做了什么?本篇文章主要解析@SpringBootApplication。

一、启动类

@SpringBootApplication

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class,args);

}

}

二、@SpringBootApplication

@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,

SpringBoot 就应该运行这个类的main方法来启动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 {

}

点进去会发现他的注解类当中还有很多注解,就是一个自定义组合注解。

接下来来对他组合的注解一一讲解。

1、@Target(ElementType.TYPE)

@Target说明了Annotation(注解)所修饰的对象范围

取值(ElementType)有:

1.CONSTRUCTOR:用于描述构造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

2、@Retention(RetentionPolicy.RUNTIME)

注解按生命周期来划分可分为3类:

1、RetentionPolicy.SOURCE:注解只保留在源文件,当java文件编译成class文件的时候,注解被遗弃;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;

3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

3、@Documented

这个注解只是用来标注生成javadoc的时候是否会被记录。

在自定义注解的时候可以使用@Documented来进行标注,如果使用@Documented标注了,在生成javadoc的时候就会把@Documented注解给显示出来。

4、@Inherited

@Inherited是一个标识,用来修饰注解,自定义注解当中会用到

首先自定义一个注解

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Inherited

public @interface ATable {

public String name() default "";

}

以下是在使用自定义注解的一个场景。

类继承关系中@Inherited的作用

类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解

@ATable

public class InheritedBase {

}

public class MyInheritedClass extends InheritedBase {

}

接口继承关系中@Inherited的作用

接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰

@ATable

public interface IInheritedInterface {

}

public interface IInheritedInterfaceChild extends IInheritedInterface {

}

类实现接口关系中@Inherited的作用

类实现接口时不会继承任何接口中定义的注解

@ATable

public interface IInheritedInterface {

}

public class MyInheritedClassUseInterface implements IInheritedInterface {

}

5、@SpringBootConfiguration

标注在某个类上,表示这是一个Spring Boot的配置类

点进去会发现,他其实也是一个自定义注解

@Configuration学spring的应该对他不陌生

作用:指定当前类是一个配置类,在使用spring的时候刚开始都是xml配置,也正是这个注解,开启了类配置方式。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Configuration

public @interface SpringBootConfiguration {

}

6、@EnableAutoConfiguration

以前我们需要配置的东西,Spring Boot会帮我们自动配置;

@EnableAutoConfiguration告诉SpringBoot开启自 动配置功能;这样自动配置才能生效;

点进去会发现@Import,说白了他就是借助@Import的支持,收集和注册特定场景相关的bean定义。

@Import作用:用于导入其他的配置类

而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定http://义加载到IoC容器,仅此而已!

@SuppressWarnings("deprecation")

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(EnableAutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

}

EnableAutoConfigurationImportSelector:导入哪些组件的选择器;

会给容器中导入非常多的自动配置类(xxxAutoConfiguration);

大概的流程就是:

Spring Boot在启动的时候,通过EnableAutoConfigurationImportSelector类,从类路径下的

META-INF/spring.factories中获取EnableAutoConfiguration指定的值(就是上方截图),

以全类名反射的创建方式,将这些值作为自动配置类导入到容器中,自动配置类就生效,

帮我们进行自动配置工作;

以前我们需要自己配置的东西,自动配置类都帮我们配置好了,这也就是使用springboot在使用spring,springmvc不用配置视图解析器、数据库连接池、事务 等配置的原因。直接开箱即用。

当然springboot也给我提供了修改配置的方法,那就是通过yml或者propertie文件来进行修改springboot为我们配置好的配置默认值。

7、@ComponentScan

作用:用于通过注解指定spring在创建容器时要扫描的包

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

@ComponentScan("com.gzl")

这也就是springboot启动类为什么放在包外的原因。

三http://、不使用这个注解能否启动项目

把@SpringBootApplication换成以下三个注解,照样可以正常启动。

package com.gzl.cn;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

@Configuration

@EnableAutoConfiguration

@ComponentScan

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class,args);

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot整合Active消息队列
下一篇:Windows下如何安装配置Redis环境
相关文章

 发表评论

暂时没有评论,来抢沙发吧~