@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,java
SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;spring
相关配置启动都是由该注解来帮咱们完成的,点进去了解一下数据库
@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 { }
点进去会发现他的注解类当中还有不少注解,就是一个自定义组合注解。springboot
接下来来对他组合的注解一一讲解。
《2020最新Java基础精讲视频教程和学习路线!》mvc
@Target说明了Annotation(注解)所修饰的对象范围
取值(ElementType)有:框架
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
注解按生命周期来划分可分为3类:jvm
一、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
二、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
三、RetentionPolicy.RUNTIME:注解不只被保存到class文件中,jvm加载class文件以后,仍然存在;
这个注解只是用来标注生成javadoc的时候是否会被记录。学习
在自定义注解的时候能够使用@Documented来进行标注,若是使用@Documented标注了,在生成javadoc的时候就会把@Documented注解给显示出来。spa
@Inherited是一个标识,用来修饰注解,自定义注解当中会用到.net
首先自定义一个注解
@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 { }
标注在某个类上,表示这是一个Spring Boot的配置类
点进去会发现,他其实也是一个自定义注解
@Configuration学spring的应该对他不陌生
做用:指定当前类是一个配置类,在使用spring的时候刚开始都是xml配置,也正是这个注解,开启了类配置方式。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
之前咱们须要配置的东西,Spring Boot会帮咱们自动配置;
@EnableAutoConfiguration告诉SpringBoot开启自 动配置功能;这样自动配置才能生效;
点进去会发现@Import,说白了他就是借助@Import的支持,收集和注册特定场景相关的bean定义。
@Import做用:用于导入其余的配置类
而@EnableAutoConfiguration也是借助@Import的帮助,将全部符合自动配置条件的bean定义加载到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为咱们配置好的配置默认值。
做用:用于经过注解指定spring在建立容器时要扫描的包
咱们能够经过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,若是不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
@ComponentScan("com.gzl")
这也就是springboot启动类为何放在包外的缘由。
把@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); } }
target=https%3A//blog.csdn.net/weixin_43888891)
连接地址: https://blog.csdn.net/weixin_43888891/article/details/110457235