SpringBoot開發自己的@Enable功能

www88jmpcom17176934555發表於2021-03-29

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

相關文章