Fork me on GitHub

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,就可以自动完成初始化功能。

posted @ 2020-04-08 10:56  迁梦余光  阅读(1431)  评论(0编辑  收藏  举报