SpringBoot中@Enablexxx注解详解
在使用springBoot集成其他三方框架的时候经常能看到@Enablexxx相关的注解。
它的作用就是开启某项功能,比如@EnableScheduling开启调度任务,
@EnableDiscoveryClient开始nacos注册中心的服务注册功能,这些@Enablexxx注解随处可见。
那他的实现原理是什么呢?
下面来实现一个自己的开关功能,比如@EnableLock,这是一个使能锁的功能。
通过@EnableLock注解就能很清晰的理解@Enablexxx相关注解的实现原理。
实现功能配置类
@Configuration
public class LockConfiguration {
@Bean
public LockService lockService() {
return new LockService();
}
}
public class LockService {
public void lock() {
System.out.println("lock something");
}
public void unLock() {
System.out.println("unLock something");
}
}
这里就是做一个简单的演示,LockService类的作用就是加锁和解锁。
LockConfiguration就是一个配置类,把LockService对象注入Spring容器中。
这里相当于实现了锁的功能,如果能够把LockConfiguration配置类识别并导入Spring容器就实现了我们的目的。
实现@EnableLock注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(LockConfiguration.class)
public @interface EnableLock {
}
这里稍作解释下:
@Target(ElementType.TYPE)表示@EnableLock注解只能用在类上。
@Retention(RetentionPolicy.RUNTIME)表明注解作用在程序运行时。
@Documented就是一个文档标识。
@Inherited表示注解可被继承,比如一个类Person被@EnableLock标注了,那么Student类继承Person,那么Student类相当于也被标注了@EnableLock注解。
@Import(LockConfiguration.class)导入锁配置类,相当于LockConfiguration.class
配置类和LockConfiguration.class中注入的bean对象都可以导入到Spring容器中。
如果对@Import注解的作用不是很明确,可以看我的另一篇文章Spring中@Import注解详解,里面对@Import注解做了十分详细的总结。
使用@EnableLock功能
@EnableLock
public class ImportStudyApplication {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ImportStudyApplication.class);
LockService lockService = (LockService)ac.getBean(LockService.class);
lockService.lock();
lockService.unLock();
}
}
在ImportStudyApplication类上标注了@EnableLock相当于打开了LockConfiguration配置,因此LockConfiguration配置类的注入的对象都能成功导入到Spring容器。
测试结果:
可以看到,LockService对象已经可以成功从容器中获取并使用,所有@EnableLock注解生效了。
下面来看一个不加@EnableLock的效果
看到了吧,如果不加@EnableLock,LockService对象是获取不到的。
@Enablexxx注解总结
@Enablexxx注解的本质就是结合@Import注解把已经实现的功能打开,一般用在框架代码中。如果您的公司内部需要实现一个通用的框架或者功能,你就可以在实现后通过@Enablexxx注解结合@Import注解导入这个框架或功能的配置类,然后在需要使用的地方添加上@Enablexxx注解就可以了,使用起来非常方便且实用。
希望文章对您有用,你们的点赞、关注是作者持续输出的动力源泉。
请先 后发表评论~