@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);
}
}
启动服务后,在控制台可以看到输出信息。
完毕!!!
给个关注,转发呗,谢谢!!!
Restful API设计规范
Java代码开发规范
SpringBoot多数据源配置详解
SpringBoot Atomikos多数据源分布式事务
Spring MVC 异步请求方式
Spring MVC 异常处理方式
SpringMVC参数统一验证方法
zookeeper实现分布式缓存
,