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

自己建网站流程云主机免费申请

自己建网站流程,云主机免费申请,百度信息流广告位置,网站开发公司推荐0、基础#xff1a;Bean的生命周期 在Spring中#xff0c;由于IOC的控制反转#xff0c;创建对象不再是简单的new出来#xff0c;而是交给Spring去创建#xff0c;会经历一系列Bean的生命周期才创建出相应的对象。而循环依赖问题也是由Bean的生命周期过程导致的问题#…0、基础Bean的生命周期 在Spring中由于IOC的控制反转创建对象不再是简单的new出来而是交给Spring去创建会经历一系列Bean的生命周期才创建出相应的对象。而循环依赖问题也是由Bean的生命周期过程导致的问题因此我们首先需要了解Bean的生命周期。 Bean的生命周期可以概括为4步 实例化----属性注入----初始化----销毁 详细的讲步骤如下 ******************************************实例化123******************************************* 定位Spring容器会根据配置文件如XML、注解等或编程式配置来确定需要创建的Bean。 加载Spring容器会加载配置文件并解析其中的Bean定义将其转换为内部数据结构例如BeanDefinition。 实例化在实例化阶段Spring容器会根据Bean定义中的信息创建Bean的实例。这个过程可以通过构造函数实例化、工厂方法实例化或者通过反射机制来实现。*****************************************属性注入4********************************************* 属性注入在实例化Bean之后Spring容器会对Bean进行属性注入。这可以通过setter方法注入、构造函数参数注入或字段注入等方式来完成。 ****************************************初始化5~9******************************************** Aware接口回调如果Bean实现了Spring的Aware接口容器会通过回调方式将一些特殊的资源注入到Bean中。例如如果Bean实现了BeanFactoryAware接口容器会将当前的BeanFactory实例注入到Bean中。 初始化前回调如果Bean实现了InitializingBean接口容器会在初始化之前调用它的afterPropertiesSet()方法给Bean一个机会执行一些初始化操作。同时Spring容器还支持使用自定义的初始化方法。 初始化后回调如果Bean配置了初始化回调方法容器会调用该方法进行一些自定义的初始化逻辑处理。 后置处理器BeanPostProcessorSpring容器会调用注册的Bean后置处理器对Bean进行加工和增强。例如可以通过AOP技术在这个阶段为Bean动态生成代理对象。 完成至此Bean已经成功创建并且已经完成了所有的初始化过程。此时可以将Bean提供给其他对象使用。 ****************************************销毁10、11****************************************** 销毁前回调PreDestroy在容器关闭之前调用Bean的销毁前回调方法执行一些清理操作和释放资源的任务。 销毁容器关闭时销毁所有Bean实例包括调用相应Bean的销毁方法进行最终的清理和资源释放。 1、循环依赖问题 例如下面的代码A和B类就构成了循环依赖原因如下 Component public class A {Autowiredprivate B b; } Component public class B{Autowiredprivate A a; }创建Bean的步骤  Spring 扫描 class 得到 BeanDefinition根据得到的 BeanDefinition 去生成 bean首先根据 class 推断构造方法根据推断出来的构造方法反射得到一个对象我们称为原始对象填充原始对象中的属性依赖注入如果原始对象中的某个方法被 AOP 了那么则需要根据原始对象生成一个代理对象把最终生成的代理对象放入单例池源码中叫做 singletonObjects中下次 getBean 时就直接从单例池拿即可 对于上述步骤的第4步 得到原始对象后需要注入属性A 类中存在一个 B 类的 b 属性此时就会根据 b 属性的类型和属性名去 BeanFactory 中去获取 B 类所对应的单例bean。         如果此时 B 类在 BeanFactory 中还没有生成对应的 Bean那么就需要去生成就会经过 B 的 Bean 的生命周期也就会同样的需要A类的Bean就发生了循环依赖导致A和B的bean都创建不出来。 概括而言         A Bean创建–依赖了 B 属性–触发 B Bean创建—B 依赖了 A 属性—需要 A Bean但A Bean还在创建过程中 然而实际上Spring通过三级缓存的方式自动解决了这个问题 。 2、三级缓存的引入 2.1 非AOP情况下的解决方案 根据上文的分析我们发现出现循环依赖的根本原因是B的Bean需要注入A属性的时候Bean A还没有创建出来导致的。那么相应的只要         在进行依赖注入之前先把 A 的原始 Bean 放入缓存提早暴露只要放到缓存了其他 Bean 需要时就可以从缓存中拿了这个缓存就应该是earlySingletonObjects放入缓存后再进行依赖注入。         由于提前暴露在创建B的Bean过程中当需要注入A的属性时就可以从缓存中拿到A提前暴露的原始对象还不是最终Bean就解决了问题。关键在于全程只有一个A的原始对象其后续的生命周期没有变化。         如下图所示 2.2 三级缓存具体      因此对于不同时期的Bean如原始Bean、完整周期的Bean需要不同的缓存来存放底层源码中有三级缓存  /** Cache of singleton objects: bean name – bean instance */ private final Map singletonObjects new ConcurrentHashMap(256);/** Cache of singleton factories: bean name – ObjectFactory */ private final Map singletonFactories new HashMap(16);/** Cache of early singleton objects: bean name – bean instance */ private final Map earlySingletonObjects new HashMap(16);一级缓存singletonObjects缓存的是已经经历了完整生命周期的bean对象。二级缓存earlySingletonObjects比 singletonObjects 多了一个 early 表示缓存的是早期的 bean对象原始对象。早期指的是 Bean 的生命周期还没走完就把这个 Bean 放入了 earlySingletonObjects三级缓存singletonFactories缓存的是 ObjectFactory表示对象工厂用来创建某个对象的。 3、有AOP情况下使用singletonFactories  3.1 引入三级缓存 看似我们只需要1、2级缓存就能够解决问题了为什么需要三级缓存呢         这就需要考虑到AOP代理对象的问题了 上文的红字提到之所以能够提前暴露是因为假定的A的原始对象始终是同一个对象但如果有AOP的情况下呢我们考虑这样的场景 按照上文的分析假设创建B的bean过程中注入了A的原始对象属性。然后A的原始对象采用AOP产生了一个代理对象即A的Bean变成了 AOP 之后的代理对象。而B中的 属性a对应的并不是 AOP 之后的代理对象而仍然是原始对象。         也就是说这种情况下B 依赖的 A 和最终的 A 不是同一个对象 而解决这个问题的方法就是引入三级缓存的 singletonFactories  3.2 三级缓存具体解析 实际上在有AOP的情况下Spring并没有像第2节所说直接将示例缓存到二级缓存而是生成完原始对象之后”多此一举“地将实例先封装到objectFactory中在需要引用的时候再通过singletonFactory.getObject()获取。 跟进getObject()方法其实执行了getEarlyBeanReference这个关键方法。 this.addSingletonFactory(beanName, () - {return this.getEarlyBeanReference(beanName, mbd, bean);}); 也就是说Spring将当前bean缓存到earlyProxyReferences中标识提前曝光的bean。而wrapIfNecessary是用于Spring AOP自动代理的也就是说在被提前引用前进行了AOP代理并得到了代理对象。         此时earlySingletonObjects 缓存中的对象就是代理对象了 因此假设此时有其他对象依赖了A就可以从earlySingletonObjects中获取到A原始对象的代理对象了并且和A是同一个对象实现了目标。 3.3 后续依赖问题 当 B 创建完了之后A 继续进行生命周期而 A 在完成属性注入后会按照它本身的逻辑去进行AOP而此时我们知道 A 原始对象已经经历过了 AOP 所以对于 A 本身而言不会再去进行 AOP了那么怎么判断一个对象是否经历过了 AOP 呢 注意postProcessAfterInitialization方法会当前beanName是否在earlyProxyReferences中如果在就AOP过了不在则执行AOP方法。 此时对于Bean A对象而言已经完成创建了可以把它放入缓存singletonObjects中了因此从earlySingletonObjects 中得到代理对象然后入 singletonObjects 中。 至此整个循环依赖解决完毕。 4、总结  这里引用看到的一篇写的很清晰的博客http://t.csdn.cn/GeHkA的图来说明具体流程 对于三级缓存的singletonFactories总结而言 缓存的是一个 ObjectFactory 主要用来去生成原始对象进行了 AOP之后得到的「代理对象」。         在每个 Bean 的生成过程中都会提前暴露一个工厂这个工厂可能用到也可能用不到 1如果没有出现循环依赖依赖本 bean那么这个工厂无用本 bean 按照自己的生命周期执行执行完后直接把本 bean 放入 singletonObjects 中即可对应本文章的第1节 2如果出现了循环依赖依赖了本 bean则         2.1如果有 AOP 的话另外那个 bean 执行 ObjectFactory 提交得到一个 AOP 之后的代理对象。对应本文章第3节         2.2如果无需 AOP 则直接得到一个原始对象。对应本文章第2节
http://www.w-s-a.com/news/370031/

相关文章:

  • 订制型网站费用做网站的问题
  • 淮阳住房和城乡建设网站桂林新闻桂林人论坛
  • 公司网站建设价格标准老版本网站开发工具
  • 门户网站开发费怎做账做网站交互demo工具
  • 中山最好的网站建设黄村网站建设价格
  • 企业网站首页应如何布局互联网营销师证书报名入口
  • 绍兴做网站哪家好篮球网站设计
  • 鹤岗市城乡建设局网站西域电商平台官网
  • 外贸网网站建设蓝色管理系统网站模版
  • 网站服务器关闭阿里巴巴logo
  • 青岛 网站制作公司乐从网站制作
  • wordpress 微网站模板怎么用wordpress 文档下载
  • ppt网站建设的目的合肥做网站找哪家好
  • wordpress站点路径redis缓存wordpress
  • 专门设计网站的公司叫什么百度 门户网站
  • 网站建设丶金手指专业旅游网站系统哪个好
  • 苏州工业园区两学一做网站成都企业排名
  • 医药网站开发wordpress境外支付
  • 营销自己的网站网站如何做标题优化
  • 玖云建站系统wordpress nodejs版本
  • 网站开发费用计入什么二级科目重庆企业网站推广
  • wordpress 菜单怎么使用方法宜春网站推广优化
  • dede 网站图标怎么自学建筑设计
  • 河北斯皮尔网站建设做微信小程序和做网站
  • 沈阳市住房和城乡建设局网站创意上海专业网站建设
  • 免费学编程国内网站it需要什么学历
  • 相城做网站的公司网站建设范本
  • 怎么样查中企动力做的网站阿里邮箱企业版手机版
  • 电子商务网站建设与管理试卷6江门网站建设联系电话
  • 公司的网站建设做什么费用四川圣泽建设集团有限公司网站