文章目录
springboot主要通过注解的方式进行驱动,本文主要讲解@SpringBootApplication由哪几部分组成
@SpringBootApplication组合注解
1 @Target({ElementType.TYPE})
-
用于设定注解使用范围
-
ElementType的用法
-
取值 注解使用范围 METHOD 可用于方法上 TYPE 可用于类或者接口上 ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型) CONSTRUCTOR 可用于构造方法上 FIELD 可用于域上 LOCAL_VARIABLE 可用于局部变量上 PACKAGE 用于记录java文件的package信息 PARAMETER 可用于参数上
-
2 @Retention(RetentionPolicy.RUNTIME)
-
指定注释要保留多长时间
-
生命周期的划分
- RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
- RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
- RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
-
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
3 @Documented
- Documented注解表明这个注解是由 javadoc记录
4 @Inherited
- 类继承关系中@Inherited的作用
- 类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解
- 接口继承关系中@Inherited的作用
- 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
- 类实现接口关系中@Inherited的作用
- 类实现接口时不会继承任何接口中定义的注解
5 @SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
- @Configuration底层是含有@Component ,所以@Configuration 具有和 @Component 的作用。
- @Configuration可理解为用spring的时候xml里面的标签。
- 实例化bean,交给spring进行托管
6 @EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
-
@Import({Registrar.class})
BeanDefinition 生成所有bean的配置信息
@Import({AutoConfigurationImportSelector.class})
-
AutoConfigurationImportSelector
动态加载过滤
-
过程
- 获取元数据配置
- 扫描META-INF/spring.factories文件
- maven中未配置的包不会加载
- 过滤,删除不存在的包
7 @ComponentScan
- @ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。
- 会被自动装配的注解包括@Controller、@Service、@Component、@Repository、@Configrature等等。
- 注意点
-
在application.java文件中@SpringBootApplication会默认扫描当前包下及同级包目录
-
在application.java文件中@SpringBootApplication自带@ComponentScan会与@ComponentScan冲突
-
@SpringBootApplication和@ComponentScan一起使用时,则不会扫描当前包下及同级包下的目录,使得@SpringBootApplication扫描失效,需要在@ComponentScan指定需要用到的包目录
-
@ComponentScan 可以引用其他jar包目录,必须先通过maven引入
-
注意扫描可能有先后顺序
-
spring boot会考虑应用中的其他因素并推断你所需要的Spring配置。比如在A类中有一个成员变量是在jar包中的B类,如果是普通的spring mvc模式,那么你需要在xml中定义B类的一个bean对象,然后才可以在A类中使用@Autowired注解在注入此bean。但是在spring boot默认启动了自动配置,在需要B的时候可以生成B的bean对象并且注入到A中,不需要在xml中做任何配置,如果想要禁用自动配置,就将spring.boot.enableautoconfiguration的值设为false。