zoukankan      html  css  js  c++  java
  • Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用

    业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是if-else,捂脸中。。。。。。。。。。。)

    方法:经经理指导,使用BeanPostProcessor接口

    逻辑:自定义一个标签,spring实例化所有bean之后,取出每个便签的所对应的code,以及当前的code对应的runner放在一个管理器里面,使用时从管理器中取出

     实例说明:

    自定义标签

    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.PARAMETER;
    import static java.lang.annotation.ElementType.TYPE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    import org.springframework.stereotype.Component;
    
    @Documented
    @Retention(RUNTIME)
    @Target({ TYPE, METHOD, PARAMETER })
    @Component
    public @interface CacheCode {
        String code() default "";
    }

    不同类上面添加标签(根据自己业务放在类上)

    import org.springframework.stereotype.Component;
    
    import com.*.cache.annotation.CacheCode;
    
    @Component
    @CacheCode(code = "1001")
    public class Test1 implements Test{
    
        @Override
        public void test() {
            System.out.println("调用测试1");
            
        }
    
    }
    import org.springframework.stereotype.Component;
    
    import com.*.cache.annotation.CacheCode;
    
    @Component
    @CacheCode(code = "1002")
    public class Test2 implements Test{
    
        @Override
        public void test() {
        System.out.println("调用测试2");
      } }
    public interface Test {
        
        public void test();
    }

    管理器

    @Component
    public class CacheManager implements BeanPostProcessor{
        
        private Map<String, Test> runners = new HashMap<String, Test>();
        
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            Class<? extends Object> persistentClass = bean.getClass();
            CacheCode cacheCode = AnnotationUtils.findAnnotation(persistentClass, CacheCode.class);
            if (null != cacheCode) {
                String code = cacheCode.code();
                Test runner = (Test)bean;
                runners.put(code, runner);
            }
            return bean;
        }
        
        public Test getRunner(String code) {
            return runners.get(code);
        }
    }

    测试结果

  • 相关阅读:
    Maven 环境的配置
    zTree的简单例子
    plsql免安装客户端的配置
    HDU 1232 畅通工程
    HDU 5698 瞬间移动
    Codeforces 1015E1 Stars Drawing (Easy Edition)
    Codeforces 784B Santa Claus and Keyboard Check
    Codeforces 500C New Year Book Reading
    NSarray 赋值 拷贝 等问题记录
    UINavigationController 操作记录
  • 原文地址:https://www.cnblogs.com/Cassie-wang/p/10968204.html
Copyright © 2011-2022 走看看