业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存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);
}
}

测试结果

最新文章

  1. Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]
  2. Node判断文件是否链接
  3. (原创)提取Xilinx开发工具的迅雷下载地址
  4. #Deep Learning回顾#之2006年的Science Paper
  5. Java api 入门教程 之 JAVA的String 类
  6. VS中Debug和Realease、及静态库和动态库的区别整理
  7. .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?
  8. request模块提交数据
  9. 两个Python web框架:Django &amp; Tornado比较
  10. android的ScaleGestureDetector缩放类详解
  11. Firefly——dbentrust 示例DEMO (源码+教程)
  12. el-get
  13. hibernate的orphanRemoval
  14. ajax修改密码
  15. 系统学习java高并发系列三
  16. jmeter中的函数
  17. [Harbor]Docker登录Harbor仓库(HTTP方式)
  18. Linux LVM动态扩容
  19. Name方法
  20. 20145336张子扬《网络对抗》MSF基础应用

热门文章

  1. Linux 服务器 U盘安装(避免U盘启动)以及拔除U盘后无法引导系统
  2. Centos7二进制文件安装MySQL5.7.25
  3. HDU 5178 pairs(双指针)
  4. JavaScript 面向对象的编程(三) 类的继承
  5. 在centos7中使用yum安装mysql数据库并使用navicat连接
  6. vue项目使用static目录存放图片解决方案
  7. Hero HDU4310 贪心
  8. 洛谷——P1396 营救
  9. token的生成规则
  10. [Berkeley]弹性分布式数据集RDD的介绍(RDD: A Fault-Tolerant Abstraction for In-Memory Cluster Computing 论文翻译)