news 2026/3/23 2:28:26

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/3/14 0:00:04

求职兼职招聘系统源码 Python+Django+Vue 前后分离 设计文档

一、关键词求职招聘系统、兼职平台、招聘管理系统、求职系统、兼职招聘平台二、作品包含源码数据库万字设计文档全套环境和工具资源本地部署教程三、项目技术前端技术: Html、Css、Js、Vue3.2、Element-Plus后端技术:Python3.7、Django2.0、PyMySQL四、运…

作者头像 李华
网站建设 2026/3/16 1:25:35

为什么越来越多跨境卖家从平台转向独立站?

过去几年,我持续研究跨境电商增长模型,也观察到大量卖家从“单一平台依赖”走向“品牌化独立站”的转型过程。无论是年销售千万的工厂型卖家,还是从 0 到 1 的 DTC 团队,都在用同样一句话总结——“平台越来越难做了,独…

作者头像 李华
网站建设 2026/3/13 15:49:20

Android-packages/modules-由来及子目录介绍

Android AOSP packages/modules 详解 一、目录由来与演进 历史演变 Android 1.0-9.0:系统组件深度集成在 frameworks/ 中Android 10 (2019):引入 Project Mainline,创建 packages/modules目标:将关键系统服务模块化,支…

作者头像 李华