Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用
2024-09-30 17:51:24
业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存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);
}
}
测试结果
最新文章
- Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]
- Node判断文件是否链接
- (原创)提取Xilinx开发工具的迅雷下载地址
- #Deep Learning回顾#之2006年的Science Paper
- Java api 入门教程 之 JAVA的String 类
- VS中Debug和Realease、及静态库和动态库的区别整理
- .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?
- request模块提交数据
- 两个Python web框架:Django &; Tornado比较
- android的ScaleGestureDetector缩放类详解
- Firefly——dbentrust 示例DEMO (源码+教程)
- el-get
- hibernate的orphanRemoval
- ajax修改密码
- 系统学习java高并发系列三
- jmeter中的函数
- [Harbor]Docker登录Harbor仓库(HTTP方式)
- Linux LVM动态扩容
- Name方法
- 20145336张子扬《网络对抗》MSF基础应用
热门文章
- Linux 服务器 U盘安装(避免U盘启动)以及拔除U盘后无法引导系统
- Centos7二进制文件安装MySQL5.7.25
- HDU 5178 pairs(双指针)
- JavaScript 面向对象的编程(三) 类的继承
- 在centos7中使用yum安装mysql数据库并使用navicat连接
- vue项目使用static目录存放图片解决方案
- Hero HDU4310 贪心
- 洛谷——P1396 营救
- token的生成规则
- [Berkeley]弹性分布式数据集RDD的介绍(RDD: A Fault-Tolerant Abstraction for In-Memory Cluster Computing 论文翻译)