当前位置: 首页 > news >正文

网页设计与制作项目教程黑马程序员网站优化入门

网页设计与制作项目教程黑马程序员,网站优化入门,重庆做网站开发的公司,潍坊软件网站开发目录 Bean的实例化 BeanFactoryPostProcessor 属性赋值 循环依赖 初始化 处理各种Aware接口 执行BeanPostProcessor前置处理 执行InitializingBean初始化方法或执行init-method自定义初始化方法 执行BeanPostProcessor后置处理 销毁 Spring Bean 的生命周期总体分为…

目录

Bean的实例化

BeanFactoryPostProcessor

属性赋值

循环依赖

初始化 

处理各种Aware接口

执行BeanPostProcessor前置处理

执行InitializingBean初始化方法或执行init-method自定义初始化方法 

 执行BeanPostProcessor后置处理 

销毁


Spring Bean 的生命周期总体分为四个阶段:

  •         实例化
  •         属性赋值
  •         初始化
  •         销毁

Bean的实例化

Spring容器在进行初始化时,会将xml或者配置类中配置的相关的类通过Java Proxy(反射)的方式创建出一个BeanDefinition对象,然后将所有的BeanDefinition对象存在一个beanDefinitionMap的集合中去,xml中配置的bean的id或者注解配置的value属性作为存入Map的key,整个BeanDefinition对象作为value保存。

BeanFactoryPostProcessor

BeanFactoryPostProcessor是一个接口规范,实现了该接口的类只要交由Spring容器管理的话,那么 Spring就会回调该接口的方法,用于对BeanDefinition注册和修改的功能。如果实现了这个接口并在其中完成了一些BeanDefinition的注册或修改,那么在Bean真正实例化之前,会先回调这个接口的方法,执行其中的逻辑,如果没有实现该接口,那么完成真正的实例化。

属性赋值

BeanDefinition 中有对当前Bean实体的注入信息通过属性propertyValues进行了存储,Spring在进行属性注入时,会分为如下几种情况:

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
  • 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没 有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
  • 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖)

循环依赖

多个实体之间相互依赖并形成闭环的情况就叫做"循环依赖",也叫做“循环引用”,当一个Bean对象中如果引用了另一个Bean对象时,会暂停自己的初始化,先将引用的那个Bean对象先创建出来,然后再继续自己的初始化过程;但在这个过程中,可能会出现引用的那个Bean对象中也引用了引用它的Bean对象,这个时候就会产生循环依赖的情况。

为了解决循环依赖,Spring提供了三级缓存存储完整的Bean实例和半成品的Bean实例:

  • 最终存储单例Bean成品的容器,即实例化和初始化都完成的Bean,称之为"一级缓存" Map singletonObjects = new ConcurrentHashMap(256);
  • 早期Bean单例池,缓存半成品对象,且当前对象已经被其他对象引用了,称之为"二级缓存" Map earlySingletonObjects = new ConcurrentHashMap(16);
  • 单例Bean的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean,称之为"三 级缓存" Map> singletonFactories = new HashMap(16);

有了三级缓存的后,在属性赋值阶段会如果某个Bean中引用其他Bean,那么会依次从“三级缓存”往“一级缓存”中找,避免了循环依赖的问题。

初始化 

经过Bean的实例化和属性赋值后的Bean其实还并不是一个完整的Bean实例对象,而是一个“半成品”,在完成它的初始化后才会成为一个完整的Bean实例对象并存放进到一个名为singletonObjects的Map中,最后当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例返回。

初始化的过程有以下几个关键点:

处理各种Aware接口

Aware接口是一种框架辅助属性注入的一种思想,为Bean生命周期各个阶段提供扩展。

  • 如果Bean实现BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,注入Bean的名字;
  • 如果Bean实现BeanClassLoaderAware接口,调用setBeanClassLoader()方法,注入ClassLoader对象的实例;
  • 如果Bean实现BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,注入的是Spring工厂;
  • 如果Bean实现ApplicationContextAware接口,会调用setApplicationContext()方法,注入Spring上下文;

执行BeanPostProcessor前置处理

Bean被实例化后,到最终缓存到名为singletonObjects单例池之前,中间会经过Bean的初始化过程, 例如:属性的填充、初始方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后 处理。跟Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor, 会在流程节点上被Spring自动调用。

执行InitializingBean初始化方法或执行init-method自定义初始化方法 

  • 如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
  • 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。 

 执行BeanPostProcessor后置处理 

如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法,由于这个方法是在Bean初始化结束后调用;

在结束以上初始化的所有过程之后,就创建出了一个完整的Bean实例对象,我们就可以通过applicationContext.getBean(beanName)使用真正的Bean对象了。

销毁

销毁一个Bean对象有两种方式:

  • 执行DisposableBean销毁Bean: 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法执行销毁;
  • 执行destroy-method自定义销毁方法: 如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的自定义销毁方法。
http://www.shuangfujiaoyu.com/news/35564.html

相关文章:

  • 展会搭建公司有哪些正规网站优化哪个公司好
  • 用帝国做的网站只收录首页图片外链生成工具在线
  • 教做家庭菜的网站seo如何建立优化网站
  • 网站开发技术服务合同范本山东关键词快速排名
  • 怎么做课题组网站com域名
  • 网站建设到哪个店做关键seo排名点击软件
  • 办公装修怎么设计网站编辑seo
  • 公司邮箱后缀正确的是以下seo研究中心教程
  • 绵阳微信网站乔拓云智能建站系统
  • 哈尔滨做网站营销网站建设哪家快
  • 重庆市建筑一体化平台广州网站优化公司如何
  • 如何做 行业社交类网站免费python在线网站
  • 网站首页只显示域名百度手机助手app下载安装
  • 做网站上线一般要多久自己建立网站步骤
  • 网站建设要注意一些什么北京快速优化排名
  • 扶贫工作网站怎么做中南建设集团有限公司
  • 定制建站网站建设快速排名seo软件
  • php 自动做网站点击量线上营销的优势
  • express 网站开发网址导航推广
  • 百度收录最高发帖网站搜索引擎是什么意思啊
  • 婚纱网站开发进度表搜索引擎优化员简历
  • 制作网站公司合同注意事项长沙优化网站
  • 做网站一年赚80亿今日国内新闻热点
  • 一个空间能否做两个网站广告外链购买平台
  • 艾臣网站建设友情链接的网站
  • 域名和网站空间相互做解析b2b平台有哪些网站
  • 电商营销型网站建设2021拉新推广佣金排行榜
  • 阿里云 网站建设seo网站推广是什么
  • 网架提升公司seo的英文全称是什么
  • 网站建设公司的政策风险seo实战密码在线阅读