当前位置: 首页 > news >正文 创建网站的各项费用贵州seo学校 news 2025/10/29 22:03:21 创建网站的各项费用,贵州seo学校,怎么做一个小程序app,网站网页?问?bean的生命周期 在 Spring 中#xff0c;BeanDefinition、Bean 实例化、依赖注入、Aware 接口的处理、以及 BeanPostProcessor 的前置和后置处理等#xff0c;都是 Spring 容器管理 Bean 生命周期的关键部分。下面我将详细解释这些过程。 1. 通过 BeanDefinition 获取 Bean…bean的生命周期 在 Spring 中BeanDefinition、Bean 实例化、依赖注入、Aware 接口的处理、以及 BeanPostProcessor 的前置和后置处理等都是 Spring 容器管理 Bean 生命周期的关键部分。下面我将详细解释这些过程。 1. 通过 BeanDefinition 获取 Bean 的定义信息 BeanDefinition 是 Spring 容器中用于描述 Bean 的元数据的接口包含了 Bean 的配置和信息如 Bean 的类名、构造参数、属性等。通过 BeanDefinitionSpring 容器可以知道如何实例化 Bean。 获取 BeanDefinition 示例 Spring 容器在启动时会加载并解析所有的配置如 XML 配置文件、注解配置、Java 配置类等将每个 Bean 的配置存储在 BeanDefinition 中。 BeanFactory beanFactory new AnnotationConfigApplicationContext(AppConfig.class); BeanDefinition beanDefinition beanFactory.getBeanDefinition(myBean); String beanClassName beanDefinition.getBeanClassName();BeanDefinition的常见方法 getBeanClassName()获取 Bean 的类名。getPropertyValues()获取 Bean 的属性值。getConstructorArgumentValues()获取 Bean 的构造方法参数。 2. 调用构造函数实例化 Bean Spring 通过反射调用构造函数来实例化 Bean。在实例化过程中Spring 会选择合适的构造器并根据配置提供的构造参数来实例化对象。 步骤 Spring 通过 BeanDefinition 中的类名和构造方法配置选择一个构造方法。如果有构造方法参数例如在 XML 配置中或注解中配置了构造器注入Spring 会从配置中获取并注入这些参数。使用反射调用构造函数创建 Bean 实例。 例如 Bean public MyBean myBean() {return new MyBean(arg1, 2); }3. Bean 的依赖注入 依赖注入是 Spring 中实现控制反转IoC的核心机制。Spring 会根据配置将 Bean 的依赖自动注入到 Bean 中。 依赖注入的方式 构造器注入通过 Bean 的构造方法传入依赖。Setter 方法注入通过设置属性的 setter 方法传入依赖。字段注入通过反射直接注入字段。 Spring 如何注入依赖 对于构造器注入Spring 会根据 Autowired 注解或 XML 配置来自动匹配依赖的类型。对于字段注入和 setter 注入Spring 会将依赖通过反射注入到 Bean 中。 4. 处理 Aware 接口BeanNameAware、BeanFactoryAware、ApplicationContextAware Spring 提供了一些接口让 Bean 在初始化过程中能够访问到容器的相关信息。通过实现这些接口Bean 可以获得更多的容器信息如其自身的 Bean 名称、BeanFactory 或 ApplicationContext。 BeanNameAware通过 setBeanName() 方法获取当前 Bean 在容器中的名称。 public class MyBean implements BeanNameAware {Overridepublic void setBeanName(String name) {System.out.println(Bean name is: name);} }BeanFactoryAware通过 setBeanFactory() 方法获得当前 BeanFactory 实例可以访问容器中的其他 Bean。 public class MyBean implements BeanFactoryAware {Overridepublic void setBeanFactory(BeanFactory beanFactory) {System.out.println(BeanFactory is: beanFactory);} }ApplicationContextAware通过 setApplicationContext() 方法获得当前 ApplicationContext 实例从而能够访问 Spring 环境和其他 Bean。 public class MyBean implements ApplicationContextAware {Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println(ApplicationContext is: applicationContext);} }5. Bean 的后置处理器BeanPostProcessor- 前置处理 BeanPostProcessor 是一个接口允许在 Bean 初始化的前后对 Bean 进行修改。Spring 会自动检测容器中实现了 BeanPostProcessor 接口的类并在每个 Bean 初始化之前和之后调用相应的方法。 postProcessBeforeInitialization在 Bean 初始化之前调用允许你修改 Bean 的属性或执行一些额外的操作。 public class MyBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(Before initialization: beanName);return bean; // 返回修改后的 Bean 对象} }这里postProcessBeforeInitialization 方法在 Bean 的初始化方法如 PostConstruct 或 afterPropertiesSet()之前被调用。 6. 初始化方法InitializingBean、init-method InitializingBean 接口afterPropertiesSet() 方法会在所有的属性都设置完毕后调用通常用于进行 Bean 的初始化操作。 public class MyBean implements InitializingBean {Overridepublic void afterPropertiesSet() throws Exception {System.out.println(Bean has been initialized);} }PostConstruct 注解这个注解标记的方法会在所有的依赖注入完成之后、Bean 初始化之前调用。 public class MyBean {PostConstructpublic void init() {System.out.println(Bean initialized using PostConstruct);} }自定义初始化方法在 XML 配置文件中或者 Java 配置类中可以通过 init-method 配置一个自定义的初始化方法。 bean idmyBean classcom.example.MyBean init-methodinit... /beanBean(initMethod init) public MyBean myBean() {return new MyBean(); }7. Bean 的后置处理器BeanPostProcessor- 后置处理 BeanPostProcessor 接口还提供了 postProcessAfterInitialization 方法该方法在 Bean 初始化完成后调用。这个方法可以用于对已经初始化的 Bean 进行修改或增强如 AOP。 postProcessAfterInitialization在 Bean 初始化之后调用通常用于处理 Bean 的代理或日志功能等。 public class MyBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(After initialization: beanName);return bean; // 返回修改后的 Bean 对象} }8. 使用Usage 发生时机初始化完成后Spring Bean 就可以进入应用程序的使用阶段。 具体操作 这时Spring Bean 已经是完整的可以被应用程序中的其他组件或类通过 Autowired 自动注入、手动查找或通过其它方式使用。Bean 可以被正常使用比如进行方法调用或响应 HTTP 请求等。 关键点 在这个阶段Bean 已经完全初始化所有的依赖都已注入并且初始化方法也已执行。 9. 销毁前处理Post-process Before Destruction 发生时机在容器销毁之前Spring 会进行销毁前的处理。 具体操作 如果 Bean 实现了 DisposableBean 接口Spring 会调用 destroy() 方法。如果 Bean 使用了 PreDestroy 注解Spring 会在销毁之前调用该方法。如果 Bean 配置了自定义销毁方法在 XML 配置中通过 destroy-method 或者 Java 配置类中的 Bean(destroyMethod ...)Spring 会调用该方法。 关键点 这个阶段主要是进行资源的释放工作比如关闭文件流、数据库连接、清理缓存等操作。 10. 销毁Destruction 发生时机Spring 容器关闭时销毁所有的 Bean。 具体操作 Spring 会在容器销毁之前销毁所有的 Bean。这个过程包括 释放所有与 Bean 相关的资源。如果 Bean 是 singleton单例模式那么销毁时会调用销毁方法。对于 prototype原型模式BeanSpring 不负责销毁通常需要开发者手动销毁。 关键点 容器关闭时Spring 会销毁所有在容器中管理的 Bean并释放相应的资源。特别是对于单例 Bean销毁时会执行注册的销毁方法。 生命周期钩子接口和注解 InitializingBean 和 DisposableBean这两个接口提供了回调方法afterPropertiesSet() 和 destroy()来进行初始化和销毁的自定义操作。PostConstruct 和 PreDestroyJava 注解分别用于定义初始化和销毁方法。BeanPostProcessor可以在 Bean 初始化前后进行处理常用于 AOP 或修改 Bean 实例。 通过这些不同的阶段和钩子方法Spring 提供了非常灵活的 Bean 生命周期管理机制允许开发者定制 Bean 的行为。 总结 Spring 的 Bean 生命周期包括从 Bean 的定义、实例化、依赖注入到初始化、销毁等多个阶段。在这个过程中BeanDefinition 提供了 Bean 的配置信息Spring 会通过反射实例化 Bean并通过注入不同的依赖来完成 Bean 的构建。BeanPostProcessor 在 Bean 初始化前后提供了扩展点允许开发者进行自定义的 Bean 修改和增强。同时通过实现 Aware 接口Bean 可以获取到容器的一些元数据从而进一步增强 Bean 的功能。 什么是 Spring 的循环依赖问题 定义 循环依赖指的是两个或多个 Bean 之间互相依赖形成一个依赖环。例如 Bean A 依赖 Bean B而 Bean B 又依赖 Bean A。更复杂的情况是多个 Bean 相互嵌套依赖比如 A → B → C → A。 问题出现的场景 在 Spring 容器中Bean 的实例化、初始化是分步骤进行的。如果 Bean 需要其依赖的对象但该对象还未完成创建就会导致循环依赖问题。 2. Spring Bean 的创建流程 实例化 (Instantiation): 创建 Bean 的原始对象通过构造器或工厂方法。属性注入 (Populate Properties): 将依赖的其他 Bean 注入到当前 Bean。初始化 (Initialization): 执行 PostConstruct 方法、InitializingBean 的回调等初始化逻辑。完成 Bean 创建: Bean 准备好供其他对象使用。 问题出现点: 如果两个 Bean 在属性注入阶段互相依赖Spring 会因依赖未完成而报错。 3. 循环依赖的分类 构造器循环依赖: 两个或多个 Bean 的构造函数中互相依赖。例如Component public class A {public A(B b) {} }Component public class B {public B(A a) {} }特点: Spring 无法解决直接报错因为在实例化阶段就需要依赖Spring 没法提前暴露 Bean。 字段/Setter 循环依赖: 两个或多个 Bean 通过字段或 Setter 方法互相依赖。例如Component public class A {Autowiredprivate B b; }Component public class B {Autowiredprivate A a; }特点: Spring 可以通过 三级缓存 解决。 4. Spring 的解决办法 4.1. 三级缓存机制 Spring 通过三级缓存机制解决 字段/Setter 循环依赖 单例池一级缓存: 保存已经完成初始化的单例 Bean。singletonObjects 映射{beanName: beanInstance}。 早期曝光的单例 Bean二级缓存: 保存半成品实例化但未初始化完成的 Bean。earlySingletonObjects 映射{beanName: earlyBeanInstance}。 单例工厂三级缓存: 保存一个工厂方法用于生成早期 Bean。singletonFactories 映射{beanName: ObjectFactory}。 4.2. 三级缓存的工作流程 实例化阶段: 创建 Bean 的实例但未注入依赖。将工厂方法ObjectFactory放入三级缓存 singletonFactories 中。 属性注入阶段: 如果 Bean 依赖另一个 Bean而该 Bean 还未完全初始化 从一级缓存中尝试获取。如果一级缓存未命中从二级缓存中获取。如果二级缓存仍未命中从三级缓存中获取并通过工厂方法生成早期 Bean随后将其移动到二级缓存。 初始化完成后: 将完全初始化的 Bean 从二级缓存移动到一级缓存并从其他缓存中移除。 4.3. 为什么需要三级缓存 问题一只有一级缓存时 只能存放完全初始化完成的 Bean对于循环依赖无法处理因为依赖对象未初始化完成时无法注入。 问题二只有二级缓存时 二级缓存直接存储早期 Bean 实例但没有工厂方法来生成代理对象。如果 Bean 是 代理对象比如使用 AOP无法提前暴露真实的代理对象。 三级缓存的作用 在实例化阶段允许通过工厂方法生成代理对象从而解决 Bean 的代理问题如 Transactional 或 Async。工厂方法可以控制生成的是原始对象还是代理对象再将其放入二级缓存。 5. 示例代码 循环依赖示例 Component public class A {Autowiredprivate B b;public A() {System.out.println(A is created);}public void doSomething() {System.out.println(A is working with B);} }Component public class B {Autowiredprivate A a;public B() {System.out.println(B is created);}public void doSomething() {System.out.println(B is working with A);} }运行输出 A is created B is created A is working with B B is working with A解析 Spring 首先实例化 Bean A但在注入 B 时发现 B 未完成。Spring 实例化 Bean B发现 A 尚未完成将早期的 A 暴露到三级缓存中。Spring 从三级缓存获取早期的 A完成 B 的依赖注入。最终完成 A 和 B 的初始化。 6. 总结 循环依赖类型: 构造器循环依赖无法解决。字段/Setter 循环依赖通过三级缓存解决。 三级缓存的必要性: 一级缓存存放完整 Bean。二级缓存存放早期 Bean但无法处理代理对象问题。三级缓存通过工厂方法解决代理 Bean 的暴露问题。 原理优势: 三级缓存确保 Spring 能在复杂场景下正确地解析和初始化循环依赖的 Bean同时支持代理对象和增强功能。 lazy可以解决构造器循环依赖 1. Lazy 的作用 当一个 Bean 使用 Lazy 注解时Spring 容器并不会在应用启动时立即实例化它而是等到该 Bean 第一次被使用时才进行实例化。这对于减少应用启动时的初始化时间或者避免不必要的资源消耗非常有帮助。 具体来说Lazy 可以用于 懒加载单例 Bean使某个单例 Bean 在第一次使用时才实例化。懒加载依赖使 Bean 的依赖对象在实际需要时才被创建而不是在 Bean 本身被实例化时就创建。 2. Lazy 的工作原理 Lazy 的工作原理基于 Spring 的 延迟初始化lazy initialization机制。具体来说它是通过 代理机制 来实现懒加载的。当一个 Bean 被标记为 Lazy 时Spring 会为该 Bean 创建一个代理对象该代理对象会在第一次被访问时才创建实际的 Bean 实例。 3. Lazy 的实现 懒加载的代理当你将一个 Bean 设置为懒加载时Spring 会使用代理来实现懒加载。在大多数情况下Spring 会使用 CGLIB 或 JDK 动态代理 创建代理对象。这个代理对象会在你第一次访问 Bean 时才初始化实际的 Bean 实例并将其代理对象替换为真正的 Bean 实例。 文章转载自: http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.sprbs.cn.gov.cn.sprbs.cn http://www.morning.ygwyt.cn.gov.cn.ygwyt.cn http://www.morning.egmux.cn.gov.cn.egmux.cn http://www.morning.kqylg.cn.gov.cn.kqylg.cn http://www.morning.mtsgx.cn.gov.cn.mtsgx.cn http://www.morning.27asw.cn.gov.cn.27asw.cn http://www.morning.kfstq.cn.gov.cn.kfstq.cn http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn http://www.morning.lxjcr.cn.gov.cn.lxjcr.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.ffrys.cn.gov.cn.ffrys.cn http://www.morning.wcqxj.cn.gov.cn.wcqxj.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.jfbgn.cn.gov.cn.jfbgn.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.yprnp.cn.gov.cn.yprnp.cn http://www.morning.pltbd.cn.gov.cn.pltbd.cn http://www.morning.prlgn.cn.gov.cn.prlgn.cn http://www.morning.sqxr.cn.gov.cn.sqxr.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn http://www.morning.qhtlq.cn.gov.cn.qhtlq.cn http://www.morning.gbyng.cn.gov.cn.gbyng.cn http://www.morning.fthcn.cn.gov.cn.fthcn.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn http://www.morning.rcwzf.cn.gov.cn.rcwzf.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.rwls.cn.gov.cn.rwls.cn http://www.morning.kybpj.cn.gov.cn.kybpj.cn http://www.morning.hsxkq.cn.gov.cn.hsxkq.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn http://www.morning.dxxnq.cn.gov.cn.dxxnq.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.qdxtj.cn.gov.cn.qdxtj.cn http://www.morning.gmgyt.cn.gov.cn.gmgyt.cn http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn http://www.morning.btblm.cn.gov.cn.btblm.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.htrzp.cn.gov.cn.htrzp.cn http://www.morning.wsyq.cn.gov.cn.wsyq.cn http://www.morning.kdlzz.cn.gov.cn.kdlzz.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.ryqsq.cn.gov.cn.ryqsq.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.wknjy.cn.gov.cn.wknjy.cn http://www.morning.zlgth.cn.gov.cn.zlgth.cn http://www.morning.ddqdl.cn.gov.cn.ddqdl.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.qbfs.cn.gov.cn.qbfs.cn http://www.morning.mrccd.cn.gov.cn.mrccd.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.cspwj.cn.gov.cn.cspwj.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.kmjbs.cn.gov.cn.kmjbs.cn http://www.morning.tnqk.cn.gov.cn.tnqk.cn http://www.morning.sfdsn.cn.gov.cn.sfdsn.cn http://www.morning.hbfqm.cn.gov.cn.hbfqm.cn http://www.morning.kxyqy.cn.gov.cn.kxyqy.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.wtwhj.cn.gov.cn.wtwhj.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.dnbkz.cn.gov.cn.dnbkz.cn 查看全文 http://www.tj-hxxt.cn/news/260616.html 相关文章: 网站开发工程师证书商务网站开发技术 wordpress 仿站思路湖南省建筑信息网 好看的网站界面设计泸州网站建设 asp.net mvc 网站开发jsp做网站 山西住房和城乡建设部网站天津网站公司 电脑版网站转手机版怎么做华为云和wordpress 企业网站推广方法有哪些做证券考试的网站 萍乡网站开发公司互联网技术岗位校园招聘 阜阳网站是wordpress 注册 填写密码 网站建设发布教程网络查询网站 建设网站那个平台好重庆网上注册公司流程 建设银行官方网站客户资料修改技术支持 郑州做网站 在哪些网站能接到活做网站备案要营业执照吗 网站功能需求说明十堰门户网站建设 做网站的资金来源如何制作网页代码 上海好牛网站建设帝国手机网站怎么做 网站上微信的链接怎么做有些网站突然无法访问 怎么查网站有没有做底部导航电商在线设计网站 基于liferay portal的乡镇企业门户网站建设研究音乐制作软件哪个好 齐齐哈尔做网站的公司盐城中瑞做网站公司 网站开发与设计实训总结南昌地宝网官网 电子商务网站建设的案例分析题中小企业怎么优化网站 公司网站制作费用多少提升学历官网报名 网站开发 系统需求文档南京网站建设案例 hao123从网上开始北京seo计费 怎样做网站运营陵水网站建设费用 黑白网站设计静态网站注入 班级网站做哪些方面做网站编码 可以做兼职的网站有哪些工作室工业产品设计公司排名 广州高端网站定制公司哪家好网络编程培训班