ImportAware應用


該接口同樣也是需要配合@Import注解進行使用,其主要作用就是配合@Enable××通過開關的形式開啟某個功能時進行各項屬性值的初始化工作。

其中比較典型的應用場景就是@EnableRedissonHttpSession

 

查看@EnableRedissonHttpSession源碼:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import({RedissonHttpSessionConfiguration.class})
@Configuration
public @interface EnableRedissonHttpSession {
    int maxInactiveIntervalInSeconds() default 1800;
 
    String keyPrefix() default "";
}

只要我們開啟了RedissonHttpSession功能,spring就會自動導入RedissonHttpSessionConfiguration.class;該注解中提供了兩個參數:

  1. maxInactiveIntervalInSeconds:會話超時時間
  2. keyPrefix:key的前綴

 

其最終就是在RedissonHttpSessionConfiguration中處理,並應用在配置類中:

@Configuration
public class RedissonHttpSessionConfiguration extends SpringHttpSessionConfiguration implements ImportAware {
    private Integer maxInactiveIntervalInSeconds;
    private String keyPrefix;
 
...
    public void setImportMetadata(AnnotationMetadata importMetadata) {
        Map<String, Object> map = importMetadata.getAnnotationAttributes(EnableRedissonHttpSession.class.getName());
        AnnotationAttributes attrs = AnnotationAttributes.fromMap(map);
        this.keyPrefix = attrs.getString("keyPrefix");
        this.maxInactiveIntervalInSeconds = (Integer)attrs.getNumber("maxInactiveIntervalInSeconds");
    }
}

 

比如需要開發自己的插件,整合到spring時就可以基於這種模式,如下簡單模擬下:

自定一個插件配置類:

@Component
public class MyDb implements ImportAware {


    private int maxConnections;


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


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

自定義注解實現開關功能:

@Retention(RetentionPolicy.RUNTIME)
@Import(MyDb.class)
public @interface EnableMyDb {
    int maxConnections() default 1000;
}

配置類開啟自己定義的插件功能:

@Configuration
@ComponentScan("com.tian")
//初始化插件值
@EnableMyDb(maxConnections = 2000)
public class AppConfig {


}

測試發現只要開啟了EnableMyDb,就可以自動完成初始化功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM