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

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

springboot设计模式 SpringBoot开发自己的Enable功能(1)

springboot设计模式 SpringBoot开发自己的Enable功能(2)

@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); } }

启动服务后,在控制台可以看到输出信息。

springboot设计模式 SpringBoot开发自己的Enable功能(3)

完毕!!!

给个关注,转发呗,谢谢!!!

Restful API设计规范

Java代码开发规范

SpringBoot多数据源配置详解

SpringBoot Atomikos多数据源分布式事务

Spring MVC 异步请求方式

Spring MVC 异常处理方式

SpringMVC参数统一验证方法

zookeeper实现分布式缓存

,