当前位置: 首页 > news >正文

Spring自定义BeanPostProcessor实现bean的代理

上文中:https://blog.csdn.net/qq_26437925/article/details/145241149 大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。


本文直接编写最简单的代码直观感受下

bean A:

@Service
public class A {public A() {System.out.println("A()");}public void say(){System.out.println("say A");}
}
  • beanPostProcessor
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Service;import java.lang.reflect.Method;@Service
public class ABeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals("a")) {System.out.println("a BeanPostProcessor postProcessAfterInitialization");return getProxy(bean);}return bean;}public Object getProxy(Object targetObject) {Enhancer enhancer = new Enhancer();Class<?> superClass = targetObject.getClass();enhancer.setSuperclass(superClass);MethodInterceptor interceptor = new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("cglib before...");Object res = methodProxy.invokeSuper(o, objects);return res;}};enhancer.setCallback(interceptor);Object targetProxy = enhancer.create();return targetProxy;}
}

基于cglib代理

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
  • config类不用EnableAspectJAutoProxy了
@Configuration
@ComponentScan("com.aop.dependency")
public class ConfigOne {
}
  • 测试类
@Test 
public void test() throws Exception {ApplicationContext ctx =new AnnotationConfigApplicationContext(ConfigOne.class);A a = (A) ctx.getBean("a");a.say();((AnnotationConfigApplicationContext) ctx).close();
}

测试输出
在这里插入图片描述

方法执行的代理输出正常

因为Cglib是用父类继承,新增了一个完整的class字节码。所以可以看到A()构造函数执行了两次, 一次是spring bean生命周期的实例化,一次则是Cglib创建出代理对象执行的。

http://www.lryc.cn/news/523423.html

相关文章:

  • 【HF设计模式】06-命令模式
  • Linux使用SSH连接GitHub指南
  • v2富文本框封装 @wangeditor/editor-for-vue
  • 【分类】【损失函数】处理类别不平衡:CEFL 和 CEFL2 损失函数的实现与应用
  • AUTOSAR从入门到精通-自动驾驶测试技术
  • 优化大型语言模型的表达能力和依赖关系:理论
  • 在Ubuntu下使用Wine运行MobaXterm并解决X服务器问题
  • 【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行
  • SW - 钣金零件保存成DWG时,需要将折弯线去掉
  • JAVA使用自定义注解,在项目中实现EXCEL文件的导出
  • 【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)
  • flutter在使用gradle时的加速
  • ABP - 缓存模块(1)
  • 二、点灯基础实验
  • 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
  • HTML<img>标签
  • 【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】
  • Linux虚拟机安装与FinalShell使用:探索Linux世界的便捷之旅
  • Mixly米思齐1.0 2.0 3.0 软件windows版本MAC苹果电脑系统安装使用常见问题与解决
  • vben5 admin ant design vue如何使用时间范围组件RangePicker
  • Kafka 日志存储 — 文件目录及日志格式
  • 故障诊断 | BWO白鲸算法优化KELM故障诊断(Matlab)
  • 一文读懂AI Agent 智能体
  • 《 C++ 点滴漫谈: 二十二 》操作符炼金术:用C++ operator重塑代码美学
  • 通信协议之多摩川编码器协议
  • 新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵
  • 4329 树的连边II
  • Spring的Bean详解=Bean别名+作用范围+使用场景
  • 聊一聊如何适应AI时代
  • dl学习笔记:(4)简单神经网络