SpringBoot开发自己的@Enable功能

@Enable*是springboot中用来启用某一个功能特性的一类注解。其中包括我们常用的@SpringBootApplication注解中用于开启自动注入的Annotation@EnableAutoConfiguration,开启异步方法的annotation@EnableAsync,开启将配置文件中的属性以bean的方式注入到IOC容器的annotation@
EnableConfigurationProperties等。

随便打开几个@Enable*的源码,比如@EnableSync,@EnableCircuitBreaker, @EnableCache
这些类中都有共同点使用了@Import注解

@Import 这个类的注释是这么说的:

Indicates one or more component classes to import — typically @Configuration classes.

@Import用来导入一个或多个类(bean被spring容器托管)、或者配置类(配置类里面的Bean都会被spring容器托管)

在Spring4.2以后,@Import还支持导入普通的没有@Configuration注解的类。

接下来就实现自定义的一个Enable

自定义注解类:

@Retention(RetentionPolicy.RUNTIME)
@Import(Pack.class)
public @interface EnablePack {

int maxConnections() default 1000;

}
Pack.java

public class Pack implements ImportAware, ApplicationContextAware {

private ApplicationContext ctx ;

private int maxConnections;

@Override
public void setImportMetadata(AnnotationMetadata annotationMetadata) {
    Map<String, Object> attributesMap = annotationMetadata.getAnnotationAttributes(EnablePack.class.getName());
    AnnotationAttributes attrs = AnnotationAttributes.fromMap(attributesMap);
    this.maxConnections = attrs.getNumber("maxConnections");
    System.out.println(ctx.getBean(ProductService.class)) ;
    System.out.println(this.maxConnections);
}

public void store(){
    System.out.println(this.maxConnections);
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.ctx = applicationContext ;
}

}
ImportAware 接口主要配合@Import注解使用开启xxx功能。这里也可以通过继承AdviceModeImportSelector或者直接实现ImportSelector接口 来实现我们的功能。

启动类:

@SpringBootApplication
@EnableCaching
@EnablePack(maxConnections = 10000)
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
启动服务后,在控制台可以看到输出信息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!