从自定义注解到手写启动类

440

annotation-learn

  1. 了解常见注解

  2. 认识自定义注解

  3. 手写分布式任务调度(elasticjob启动类)

  4. @SpringBootApplication自动装载对象流程

一 介绍

看着代码学习注解!

开源项目gitee.com/flowerAndJa…

代码

getting-started模块 com.haopt.annotation.definition包 自定义注解代码
getting-started模块 com.haopt.annotation.meta 元注解对自定义注解修饰
springboot模块,springboot项目开发中常用的依赖
elasticjob-springboot-starter模块,自定义elastic-job启动动类,用于springboot集成。
elasticjob-test模块,用于测试分布式调度。

知识点

下方文档

二 自定义注解

1. 概述
注解是对程序进行标注和解释。给编译器看。使代码更加简洁。

2. 常见注解
@Override 重写父类方法
@Deprecated 雍余方法上,表示方法已经过期

3. 自定义注解(看代码理解)
public @interface 注解名称 {
public 属性类型 属性名() default 默认值 ;
}
备注
属性类型
基本数据类型、String、class、注解、枚举、以上类型一维数组。
属性没有默认值,必须手动赋值。

4. 元注解
描述注解的注解

5. 常用的元注解(详细查看代码)
@Target 指定注解在哪使用
@Retention 注解生存时间
@Inherited 自定义注解是否可以被子类继承

三 SpringBoot中常用的注解

1. 获取配置文件中的属性(详细使用看代码。springboot模块 com.haopt.annotation.obtain包)
@value、@ConfigurationProperties(prefix = "data")、@Configuration+@Bean,用来获取配置文件中属性

2. 条件注解
@Conditional(Class<? extends Condition>) 根据继承Condition类的matches方法返回true创建对象

@ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
@ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
@ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean

3. enable开头注解(自定义注解)
底层会依赖@Import,@Import注解加载类,这些类会被Spring创建,并放到容器中。

备注:
SpringBoot项目启动类的@SpringBootApplication含有@ComponentScan注解,@ComponentScan注解只会扫描本报下和子包下注解。
所以当导入另外一个项目依赖,并不能将bean对象加入到IOC容器中。

@Import(类名.class)提供四种导入方法
导入bean
导入配置类 可以将配置类中@Bean导入到Spring IOC容器中。
导入ImportSelector实现类 将返回值全类名数据全部导入到IOC容器中。
导入ImportBeanDefinitionRegistrar实现类 在实现方法将类导入到IOC容器中。

4. SpringBoot自动装配对象
@SpringBootApplication -> @EnableAutoConfiguration -> @Import({AutoConfigurationImportSelector.class})
-> selectImports(AnnotationMetadata annotationMetadata)
-> getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) -> META-INF/spring.factories(配置文件) -> 加载配置文件中的类