news 2026/5/2 15:30:31

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/4/30 18:52:45

学生管理系统源码 Python+Django+Vue 前后分离 设计文档

一、关键词学生管理系统、学籍管理系统、教务系统、选课系统、成绩管理系统二、作品包含源码数据库万字设计文档全套环境和工具资源本地部署教程三、项目技术前端技术:Html、Css、Js、Vue3.2、Element-Plus后端技术:Python、Django、PyMySQL四、运行环境…

作者头像 李华
网站建设 2026/4/24 21:43:04

15、高效使用浏览器:Konqueror的实用技巧与操作指南

高效使用浏览器:Konqueror的实用技巧与操作指南 1. ALT - F2运行框与页面加载 ALT - F2运行框十分强大,它的功能与Konqueror地址栏类似,能启动Konqueror并显示你输入的任何URL网页。若页面停止加载或加载不正常,可点击“重新加载”按钮重试。不过,重新加载后页面仍可能显…

作者头像 李华
网站建设 2026/4/27 15:58:39

【单片机毕业设计】【mcugc-mcu931】基于单片机的厨房监测系统

一、基本介绍功能简介:1、通过MQ-5检测可燃气体浓度,当浓度大于设置大值,进行通风,并拧紧燃气阀门(步进电机模拟) 2、通过DHT11检测温湿度,如果温度大于设置最大值或湿度大于设置最大值&#xf…

作者头像 李华
网站建设 2026/4/18 11:01:24

EmotiVoice在心理治疗暴露疗法中的辅助作用

EmotiVoice在心理治疗暴露疗法中的辅助作用 在创伤后应激障碍(PTSD)或特定恐惧症的临床干预中,一个核心挑战是如何安全、可控地引导患者重新面对那些引发强烈焦虑的记忆场景。传统暴露疗法依赖治疗师口头描述情境,或播放预先录制的…

作者头像 李华