Spring boot @Enable*注解的工作原理
请关注我的微信公众号

技术交流群 (仅作技术交流):642646237
请关注我的头条号:

@Enable*
注解启动特性。
复习一下ConfigurationProperties
注解

运行以下程序:

解析@ConfigurationProperties
背后的原理

虽然上面的配置也可以正常运行,但是最终使用的是
@EnableConfigurationProperties
注解。

使用spring boot的异步功能——没有异步功能
定义一个任务类:

运行程序:

发现不是异步的。
使用spring boot的异步功能
在需要异步执行的类前面加上@Async
:

或在需要异步执行的方法上加上
@Async
:
也不需要继承Runnable
接口:

在类上加@Async
,整个类的所有方法都能异步执行:

@EnableAsync
开启异步功能:

spring boot的@Enable*
注解的原理
spring boot的@Enable*
注解最后使用了@Import
注解。
@Import
能够代替@Component
.
@Import({User.class,Role.class})
,User
、Role
不需要添加Component
注解,就能够被spring管理。

同样配置类也不需要添加@Configuration
就可以导入。


Import
注解配合ImportSelector
接口
实现ImportSelector
接口:

记住User
和Role
不需要添加@Component
注解:

记住MyConfiguration
不需要添加@Configuration
注解:

@Import
导入ImportSelector
的实现类:

Import
注解配合ImportBeanDefinitionRegistrar
接口使用
实现ImportBeanDefinitionRegistrar
接口:

ImportBeanDefinitionRegistrar
接口跟ImportSelector
接口不一样,需要自己手动注册bean。

自定义注解,Import
注解配合ImportBeanDefinitionRegistrar
接口
在下面的例子中,不会让ImportBeanDefinitionRegistrar
注入任何的bean,因为之前的例子已经演示过了,现在只是演示自定义注解在ImportBeanDefinitionRegistrar
中可以获取到自定义注解的信息。

之前一直忽视的
importingClassMetadata
参数,现在使用起来了,通过该参数我们可以获取注解的一些信息。我们自定义了一个名为
MyAnnotation
的注解:
请注意该注解使用了
@Import
注解。

运行上面的程序,我们发现我们已经成功获取了自定义注解的
name
属性的值
Import
注解配合ImportBeanDefinitionRegistrar
接口的例子
下面这个例子没有什么特别的意思,就是整合了Import
、ImportBeanDefinitionRegistrar
和BeanPostProcessor
。
从之前的教程我们知道bean在实例化的过程中会调用BeanPostProcessor
的相关方法。
现在我们使用ImportBeanDefinitionRegistrar
来注册BeanPostProcessor
的实现类。

BeanPostProcessor
的实现类有一个属性packages
,该属性什么时候被赋值呢?这就借助ImportBeanDefinitionRegistrar
。

Import
注解是没有packages
属性,所以我们需要自定义注解:

现在我们可以使用自定义的注解MyAnnotation
:
