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注解就可以了,使用起来非常方便且实用。

希望文章对您有用,你们的点赞、关注是作者持续输出的动力源泉。

举报
评论 0