@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 協議》,轉載必須註明作者和本文連結