該接口同樣也是需要配合@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;該注解中提供了兩個參數:
- maxInactiveIntervalInSeconds:會話超時時間
- 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,就可以自動完成初始化功能。