zoukankan      html  css  js  c++  java
  • 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,就可以自动完成初始化功能。

  • 相关阅读:
    Java基础知识面试题(2021年最新版,持续更新...)整理
    windows10 cmd窗口输出卡住(看这篇就够了)
    windows10 powershell窗口输出卡住(看这篇就够了)
    Golang函数相关
    内存对齐详解
    Go编程模式Pipeline
    管道符、重定向与环境变量(Linux就该这么学第三章)
    GMP模型简介
    新手必须掌握的Linux命令(Linux就该这么学第二章)
    Goland运行项目报错:CreateProcess error=216, 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。
  • 原文地址:https://www.cnblogs.com/tianboblog/p/12658539.html
Copyright © 2011-2022 走看看