news 2026/6/10 16:58:35

SpringBean生命周期,动态代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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));}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:09:47

Python语言编程导论第八章 文件处理

内容提要概述文件的常见操作目录的常见操作一、概述数据的存储可以使用数据库,也可以使用文件。数据库保持了数据的完整性和关联性,且使用数据更安全、可靠。使用文件存储数据则非常简单、易用,不必安装数据库管理系统等运行环境。文件通常用…

作者头像 李华
网站建设 2026/6/10 14:09:02

力扣题目1创作思路

一.题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。…

作者头像 李华
网站建设 2026/6/10 15:46:52

向 VictoriaMetrics 写入过去或未来时间戳指标的测试

公司使用推模式上传指标,有必要对“乱序问题进行”测试: 1. 使用推模式写入过去数据:只要在“保留周期”内即可写入成功,能够读取;(写入1个月前的指标,保留周期41天) 2. 使用推模式…

作者头像 李华
网站建设 2026/6/10 14:01:55

基于深度学习的水果检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)

视频演示 基于深度学习的水果检测系统1. 前言​ 随着计算机视觉技术的快速发展,基于深度学习的目标检测方法在农业、食品工业及日常生活中的应用不断拓展。水果检测作为其中的重要场景,不仅能为采摘、分拣、销售等环节提供自动化支持,也在智…

作者头像 李华
网站建设 2026/6/10 14:14:02

Android-Camera-为啥不移到packages/module

Camera 为何没有完全迁移到 packages/modules Camera 和 Audio 类似,是 Android 系统中最复杂、最集成的子系统之一,其未完全模块化的原因更为深刻。 一、Camera 系统的现状分布 当前架构层次 1. 应用层 (packages/apps/Camera2/) 2. 框架层 (frameworks…

作者头像 李华