news 2026/5/26 14:59:15

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/5/26 5:51:04

2026年java找工作难吗?java就业环境怎么样?

2026年找工作会“难”,但不是对所有人。 它会呈现出非常明显的 “两极分化” 态势,对初级/基础不牢的求职者: 会非常困难,内卷严重,要求水涨船高。对中高级/有核心竞争力(架构、高并发、云原生等&#xff0…

作者头像 李华
网站建设 2026/5/26 5:55:58

告别生鲜损耗困局:从经验猜货到数据驱动的盈利升级

社区生鲜的盈利枷锁:凭经验进货的损耗困局生鲜损耗是社区生鲜门店盈利的核心障碍,绝大多数管理者都困在“凭经验猜进货” 的被动处境中。就拿社区生鲜店主王哥来说,他虽靠着 “当日鲜采” 的口碑攒下大批忠实熟客,却始终逃不过高损…

作者头像 李华
网站建设 2026/5/26 7:14:55

定制报告-个性化定制-按需专项研究报告-智信中科研究网

定制报告-个性化定制-按需专项研究报告-智信中科研究网市场专项研究报告智信中科研究网个性化定制报告全力解决您的各类需求,为了满足客户在不同发展阶段的不同需求,智信中科研究网可以依据客户的个性化需求,针对性帮助客户完成符合需求的市场…

作者头像 李华
网站建设 2026/5/26 6:49:57

Linux 内存管理:TLB ASID

文章目录1. 前言2. TLB ASID 的硬件支持2.1 概念2.2 TLB 查找3. Linux 下 TLB ASID 管理4. 参考资料1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. TLB ASID 的硬件支持 2.1 概念 什么是 TLB&…

作者头像 李华