美文网首页Java服务器端编程SpringFramework
Spring boot @Enable*注解的工作原理

Spring boot @Enable*注解的工作原理

作者: 每天学点编程 | 来源:发表于2017-08-28 03:57 被阅读643次

请关注我的微信公众号


个人微信公众号

技术交流群 (仅作技术交流):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})UserRole不需要添加Component注解,就能够被spring管理。

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

Import注解配合ImportSelector接口

实现ImportSelector接口:

记住UserRole不需要添加@Component注解:

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

@Import导入ImportSelector的实现类:

Import注解配合ImportBeanDefinitionRegistrar接口使用

实现ImportBeanDefinitionRegistrar接口:

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

自定义注解,Import注解配合ImportBeanDefinitionRegistrar接口

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


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

请注意该注解使用了@Import注解。
运行上面的程序,我们发现我们已经成功获取了自定义注解的name属性的值

Import注解配合ImportBeanDefinitionRegistrar接口的例子

下面这个例子没有什么特别的意思,就是整合了ImportImportBeanDefinitionRegistrarBeanPostProcessor
从之前的教程我们知道bean在实例化的过程中会调用BeanPostProcessor的相关方法。
现在我们使用ImportBeanDefinitionRegistrar来注册BeanPostProcessor的实现类。

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


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

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

相关文章

网友评论

    本文标题:Spring boot @Enable*注解的工作原理

    本文链接:https://www.haomeiwen.com/subject/ihcmdxtx.html