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

SpringBean生命周期,动态代理

SpringBean生命周期,动态代理

  • SpringBean生命周期
    • 流程
    • 代码
  • 动态代理
    • CglibDynamicProxy
    • JDKDynamicProxy

SpringBean生命周期

流程

代码

packagecn.yx.zg.lifecyclebean;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.*;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.config.BeanFactoryPostProcessor;importorg.springframework.beans.factory.config.BeanPostProcessor;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;@ComponentpublicclassCompleteLifecycleBeanimplementsBeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{privateStringbeanName;privateBeanFactorybeanFactory;privateApplicationContextapplicationContext;privateDatabaseConnectiondatabaseConnection;// =============== 1. 实例化阶段 ===============publicCompleteLifecycleBean(){System.out.println("=== 1. 构造方法执行 ===");System.out.println(" 创建 CompleteLifecycleBean 实例");System.out.println(" 此时依赖还未注入,databaseConnection = "+databaseConnection);}// =============== 2. 依赖注入阶段 ===============@AutowiredpublicvoidsetDatabaseConnection(DatabaseConnectiondatabaseConnection){System.out.println("=== 2. 依赖注入 ===");System.out.println(" 注入 DatabaseConnection");this.databaseConnection=databaseConnection;System.out.println(" databaseConnection = "+databaseConnection);}// =============== 3. Aware 接口回调 ===============@OverridepublicvoidsetBeanName(Stringname){this.beanName=name;System.out.println("=== 3.1 BeanNameAware ===");System.out.println(" Bean 名称: "+name);}@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory)throwsBeansException{this.beanFactory=beanFactory;System.out.println("=== 3.2 BeanFactoryAware ===");System.out.println(" BeanFactory 已注入");}@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this.applicationContext=applicationContext;System.out.println("=== 3.3 ApplicationContextAware ===");System.out.println(" ApplicationContext 已注入");}// =============== 4/6. BeanPostProcessor 前后置处理 ===============// 在 CustomBeanPostProcessor 中实现// =============== 5. 初始化方法 ===============@PostConstructpublicvoidpostConstructMethod(){System.out.println("=== 5.1 @PostConstruct ===");System.out.println(" 执行 @PostConstruct 方法");System.out.println(" 验证依赖是否注入: "+(databaseConnection!=null));initializeConnection();}@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("=== 5.2 InitializingBean ===");System.out.println(" 执行 afterPropertiesSet()");validateConfiguration();}// 通过 @Bean 或 XML 配置的 init-methodpublicvoidcustomInitMethod(){System.out.println("=== 5.3 自定义 init-method ===");System.out.println(" 执行自定义初始化方法");loadInitialData();}// =============== 7. Bean 就绪使用 ===============publicvoidprocessRequest(){System.out.println("=== 7. Bean 执行业务逻辑 ===");if(databaseConnection==null){thrownewIllegalStateException("数据库连接未初始化");}System.out.println(" 处理业务请求");databaseConnection.executeQuery("SELECT * FROM users");}// =============== 8. 销毁方法 ===============@PreDestroypublicvoidpreDestroyMethod(){System.out.println("=== 8.1 @PreDestroy ===");System.out.println(" 执行 @PreDestroy 方法");releaseExternalResources();}@Overridepublicvoiddestroy()throwsException{System.out.println("=== 8.2 DisposableBean ===");System.out.println(" 执行 destroy() 方法");if(databaseConnection!=null){databaseConnection.close();}}// 通过 @Bean 或 XML 配置的 destroy-methodpublicvoidcustomDestroyMethod(){System.out.println("=== 8.3 自定义 destroy-method ===");System.out.println(" 执行自定义销毁方法");System.out.println(" Bean 销毁完成");}// =============== 私有辅助方法 ===============privatevoidinitializeConnection(){System.out.println(" 初始化数据库连接...");// 初始化逻辑}privatevoidvalidateConfiguration(){System.out.println(" 验证配置...");// 验证逻辑}privatevoidloadInitialData(){System.out.println(" 加载初始数据...");// 数据加载逻辑}privatevoidreleaseExternalResources(){System.out.println(" 释放外部资源...");// 资源释放逻辑}@OverridepublicStringtoString(){return"CompleteLifecycleBean{"+"beanName='"+beanName+'\''+", databaseConnection="+databaseConnection+'}';}}// 依赖的 Bean@ComponentclassDatabaseConnection{publicvoidexecuteQuery(Stringsql){System.out.println("执行 SQL: "+sql);}publicvoidclose(){System.out.println("关闭数据库连接");}}@ComponentclassCustomBeanPostProcessorimplementsBeanPostProcessor{@OverridepublicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{if(beaninstanceofCompleteLifecycleBean){System.out.println("=== 4. BeanPostProcessor 前置处理 ===");System.out.println(" 处理 Bean: "+beanName);System.out.println(" 可以修改 Bean 属性或返回包装对象");// 示例:修改 Bean 属性CompleteLifecycleBeanlifecycleBean=(CompleteLifecycleBean)bean;System.out.println(" 当前状态: "+lifecycleBean);// 可以在这里进行一些前置检查System.out.println(" 前置处理完成");}returnbean;}@OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{if(beaninstanceofCompleteLifecycleBean){System.out.println("=== 6. BeanPostProcessor 后置处理 ===");System.out.println(" 处理 Bean: "+beanName);System.out.println(" Bean 初始化完成,可以进行包装");// 示例:创建代理对象(AOP 通常在这里实现)System.out.println(" 可以返回代理对象增强功能");System.out.println(" 后置处理完成");// 返回原始 Bean 或代理 Bean// return Proxy.newProxyInstance(...);}returnbean;}}@ComponentclassMyBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory){System.out.println("BeanFactoryPostProcessor 执行");// 在 Bean 实例化之前修改 Bean 定义}}

动态代理

CglibDynamicProxy

packagecn.yx.zg.proxy;importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;importjava.lang.reflect.Method;// 目标类(不需要实现接口)classProductService{publicvoidaddProduct(Stringname){System.out.println("添加产品: "+name);}publicvoidaddProduct(Stringname,Integerage){System.out.println("添加产品: "+name+"年龄"+age);}publicStringgetProduct(intid){System.out.println("查询产品ID: "+id);return"Product"+id;}}// CGLIB方法拦截器classMyMethodInterceptorimplementsMethodInterceptor{@OverridepublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{System.out.println("CGLIB代理前处理 - 方法名: "+method.getName());Objectresult=proxy.invokeSuper(obj,args);System.out.println("CGLIB代理后处理");returnresult;}}publicclassCglibDynamicProxy{publicstaticvoidmain(String[]args){// 创建增强器Enhancerenhancer=newEnhancer();// 设置父类enhancer.setSuperclass(ProductService.class);// 设置回调函数enhancer.setCallback(newMyMethodInterceptor());// 创建代理对象ProductServiceproxy=(ProductService)enhancer.create();// 通过代理对象调用方法proxy.addProduct("手机",2);proxy.addProduct("手机");System.out.println(proxy.getProduct(1));}}

JDKDynamicProxy

packagecn.yx.zg.proxy;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;// 接口定义interfaceUserService{voidaddUser(Stringname);StringgetUser(intid);voidaddUser2(Stringname,Integerage);}// 目标对象实现classUserServiceImplimplementsUserService{@OverridepublicvoidaddUser(Stringname){System.out.println("添加用户: "+name);}@OverridepublicStringgetUser(intid){System.out.println("查询用户ID: "+id);return"User"+id;}@OverridepublicvoidaddUser2(Stringname,Integerage){System.out.println("添加用户2: "+name+", age: "+age);}}// JDK动态代理处理器classMyInvocationHandlerimplementsInvocationHandler{privateObjecttarget;publicMyInvocationHandler(Objecttarget){this.target=target;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("JDK代理前处理 - 方法名: "+method.getName());Objectresult=method.invoke(target,args);System.out.println("JDK代理后处理");returnresult;}}publicclassJDKDynamicProxy{publicstaticvoidmain(String[]args){// 创建目标对象UserServiceuserService=newUserServiceImpl();// 创建代理对象UserServiceproxy=(UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),newMyInvocationHandler(userService));// 通过代理对象调用方法proxy.addUser2("张三",20);proxy.addUser("张三");System.out.println(proxy.getUser(1));}}
http://www.cnnetsun.cn/news/114026.html

相关文章:

  • 理解线程不安全:从观察到原因分析
  • 《Java Web开发入门很简单》——学习笔记,新手入门,收藏这篇就够了
  • 2025年,国内外最火的10款降AI率工具亲测!(持续更新)
  • 基于大数据的餐饮食材管理系统的设计与实现开题报告
  • 基于大数据的交通信号智能控制系统的设计与实现开题报告
  • 基于大数据的交通信号智能控制系统的设计与实现任务书
  • 蜘蛛池站点优化思路分享
  • 2025 OA 选型关键看这 4 点:集成、灵活、安全、易用,附高性价比系统清单
  • 图神经网络与pytorch
  • Xiaomi 商城页面布局(部分)
  • FPGA以太网升级程序:便捷qspi Flash升级,具备校验功能,适用于Xilinx 7系列...
  • 运料小车装卸料控制:西门子1200PLC与TP700触摸屏联机仿真博途16
  • S32K311启动过程中,向量表重定向
  • 从蓝图到产线:高效产品信息传递的桥梁建设
  • 时间复杂度
  • 网站建设公司怎么选?2025年网站设计制作公司推荐指南
  • 今天咱们来聊一个挺有意思的优化算法改进——基于透镜成像反向策略的海洋捕食者算法。这个改进版本在原始MPA基础上搞了点新花样,咱们直接上干货看代码实现
  • Gitee:本土化DevOps平台如何重塑中国开发者生态
  • vCenter Server 8.0U3h 新增功能简介
  • Cisco NX-OS 10.6(2)F 发布 - 数据中心网络操作系统
  • Ubuntu24.04无操作卡死,无法唤醒问题以及内核版本切换记录
  • 全场景覆盖・全流程智控:分布式解决方案让多功能厅 “不止于多”
  • 【轨物方案】聚焦锯床设备智能化升级,打造工业互联网新范式
  • 【轨物交流】轨物科技亮相2025高校科技成果交易会
  • cesium加载geotiff的 四种方法
  • 【毕业设计】基于python的运维管理平台的设计与实现
  • 苹果 iOS 开发真正复杂的不是写代码这方面,是证书、构建、上架
  • FSMC-TFTLCD显示实验(5):显示一个字符串的函数传递过程追踪~
  • 基于Android的课程考勤及作业提交系统
  • 飞易通蓝牙与Wi-Fi模块:医疗产品无线连接的全能助手