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

南宁住房建设部网站免费做网站的网页

南宁住房建设部网站,免费做网站的网页,全面的网站制作,爱站网app简单说说IoC和Bean IoC#xff0c;控制反转#xff0c;想必大家都知道#xff0c;所谓的控制反转#xff0c;就是把new对象的权利交给容器#xff0c;所有的对象都被容器控制#xff0c;这就叫所谓的控制反转。 控制反转 Bean#xff0c;也不是什么新鲜玩意儿#xf…简单说说IoC和Bean IoC控制反转想必大家都知道所谓的控制反转就是把new对象的权利交给容器所有的对象都被容器控制这就叫所谓的控制反转。 控制反转 Bean也不是什么新鲜玩意儿它们就是一帮身不由己的Java对象生命周期受到容器控制。 Bean生命周期和人生 Bean生命周期四大阶段 我们知道bean的作用域有好几种这篇文章只讨论完全被IoC容器控制的单例Bean。 对于普通的Java对象来说它们的生命周期就是 实例化 对象不再被使用时通过垃圾回收机制进行回收 这就像是生活在大自然里的动物悄然出生悄然死亡。 大象-图片来源网络 而对于Spring Bean的生命周期来说可以分为四个阶段其中初始化完成之后就代表这个Bean可以使用了 实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction 人和动物不一样存在非常复杂的社会。 高楼大厦中的行人 我们来看看社会里的人一生要经历哪些阶段是不是和Bean的生命周期很像呢 出生作为一个自然人降临在这个世界 登记登记身份证号姓名正式成为人类社会的一份子 成长接受教育成为对社会有用的人 工作为社会创造价值 死亡人死如灯灭不过人这盏灯灭了还要把灯台埋起来 image-20220303101042089 Bean实例化的时机也分为两种BeanFactory管理的Bean是在使用到Bean的时候才会实例化BeanApplicantContext管理的Bean在容器初始化的时候就回完成Bean实例化。 BeanFactory就是相对不那么健全的原始一些的社会ApplicantContext是发达健全的现代社会。 BeanFactory和Applicantcontext Bean详细生命周期 我们讲到了Bean容器四个阶段会有一些容器级的方法进行前置和后置的处理比如InstantiationAwareBeanPostProcessor、BeanPostProcessor接口方法。这些方法独立于Bean之外并且会注册到Spring容器中在Spring容器创建Bean的时候进行一些处理。 后处理器 这就好像孩子出生之前需要做一些准备比如备孕、养胎、备产什么的出生之后需要做一些护理。孩子上学前后也需要做一些学籍的管理。 那么有了各种各样的扩展之后我们再接着看看Bean的详细的生命周期。首先我们面临一个问题——Bean的生命周期从什么时候开始的呢 上面写了Bean实例化前后可以进行一些处理但是如果从Bean实例化前算开始那么就要追溯到容器的初始化、beanDefiinition的加载开始。 所以这篇文章里我们取生命周期直接从Bean实例化开始但是大家也要知道Bean实例化前后可以使用后处理器进行处理例如BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor。 大家也不要困扰就像计算人生的起点是从母亲怀孕算起还是从孩子出生算起我们这里取了出生开始而已。 Bean生命周期 实例化第 1 步实例化一个 Bean 对象 属性赋值第 2 步为 Bean 设置相关属性和依赖 初始化初始化的阶段的步骤比较多5、6步是真正的初始化第 3、4 步为在初始化前执行第 7 步在初始化后执行初始化完成之后Bean就可以被使用了 销毁第 8~10步第8步其实也可以算到销毁阶段但不是真正意义上的销毁而是先在使用前注册了销毁的相关调用接口为了后面第9、10步真正销毁 Bean 时再执行相应的方法 我们发现Bean生命周期的详细过程是不是也像人生的历程出生、登记不过是很短的事情。慢慢长大成人要经历人生的四分之一而成长来源于教育不管是学校的还是社会的接受教育前要登记学籍上学的时候自己还要努力……到最后要发一纸薄薄的文凭标志着我们成为可以捶打的“社会人”。 然后为社会奉献四十年。最后老去离世。不过Bean的世界没有退休——当然也许人的世界也没有退休。 人的曲线 我们发现中间的一些扩展过程也可以分四类 Bean周期四类过程 一获取社会资源/Aware接口Aware接口的作用是让Bean能拿到容器的一些资源例如BeanNameAware可以拿到BeanName。就好像上学之前要取一个学名——不知道多少人上学之前不知道自己大名叫什么是吧二毛。 二必备各种手续和证/后处理器在Bean的生命周期里会有一些后处理器它们的作用就是进行一些前置和后置的处理就像上学之前需要登记学籍上学之后会拿到毕业证。 三个人选择/生命周期接口人可能无法选择如何出生但也许可以选择如何活着和如何死去InitializingBean和DisposableBean 接口就是用来定义初始化方法和销毁方法的。 四主观能动/配置生命周期方法环境影响人人也在影响环境成长的时候认真努力衰亡的时候也可以豁达乐观。可以通过配置文件自定义初始化和销毁方法。 PersonBean的一生 话不多说接下来我们拿一个例子来看看PersonBean的一生我们先来看一下它的流程 PersonBean的一生 用文字描述一下这个过程 Bean容器在配置文件中找到Person Bean的定义这个可以说是妈妈怀上了。 Bean容器使用Java 反射API创建Bean的实例孩子出生了。 Person声明了属性no、name它们会被设置相当于注册身份证号和姓名。如果属性本身是Bean则将对其进行解析和设置。 Person类实现了BeanNameAware接口通过传递Bean的名称来调用setBeanName()方法相当于起个学名。 Person类实现了BeanFactoryAware接口通过传递BeanFactory对象的实例来调用setBeanFactory()方法就像是选了一个学校。 PersonBean实现了BeanPostProcessor接口在初始化之前调用用postProcessBeforeInitialization()方法相当于入学报名。 PersonBean类实现了InitializingBean接口在设置了配置文件中定义的所有Bean属性后调用afterPropertiesSet()方法就像是入学登记。 配置文件中的Bean定义包含init-method属性该属性的值将解析为Person类中的方法名称初始化的时候会调用这个方法成长不是走个流程还需要自己不断努力。 Bean Factory对象如果附加了Bean 后置处理器就会调用postProcessAfterInitialization()方法毕业了总得拿个证。 Person类实现了DisposableBean接口则当Application不再需要Bean引用时将调用destroy()方法简单说就是人挂了。 配置文件中的Person Bean定义包含destroy-method属性所以会调用Person类中的相应方法定义相当于选好地儿埋了。 我们来看看代码 PersonBean类 创建一个PersonBean让它实现几个特殊的接口我们来观察一下它的生命周期的流转。 public class PersonBean implements InitializingBean, BeanFactoryAware, BeanNameAware, DisposableBean {/*** 身份证号*/private Integer no;/*** 姓名*/private String name;public PersonBean() {System.out.println(1.调用构造方法我出生了);}public Integer getNo() {return no;}public void setNo(Integer no) {this.no  no;}public String getName() {return name;}public void setName(String name) {this.name  name;System.out.println(2.设置属性我的名字叫name);}Overridepublic void setBeanName(String s) {System.out.println(3.调用BeanNameAware#setBeanName方法:我要上学了起了个学名);}Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println(4.调用BeanFactoryAware#setBeanFactory方法选好学校了);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(6.InitializingBean#afterPropertiesSet方法入学登记);}public void init() {System.out.println(7.自定义init方法努力上学ing);}Overridepublic void destroy() throws Exception {System.out.println(9.DisposableBean#destroy方法平淡的一生落幕了);}public void destroyMethod() {System.out.println(10.自定义destroy方法:睡了别想叫醒我);}public void work(){System.out.println(Bean使用中工作只有对社会没有用的人才放假。。);}} 实现了InitializingBean, BeanFactoryAware, BeanNameAware, DisposableBean四个接口 定义了no、name两个属性和对应的getter、setter方法 定义了一个实例方法work MyBeanPostProcessor 自定义了一个后处理器MyBeanPostProcessor public class MyBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(5.BeanPostProcessor.postProcessBeforeInitialization方法到学校报名啦);return bean;}Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(8.BeanPostProcessor#postProcessAfterInitialization方法终于毕业拿到毕业证啦);return bean;} }配置文件 定义一个配置文件spring-config.xml 使用setter注入 定义init-method和destroy-method ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean namemyBeanPostProcessor classcn.fighter3.spring.life.MyBeanPostProcessor /bean namepersonBean classcn.fighter3.spring.life.PersonBeaninit-methodinit destroy-methoddestroyMethodproperty nameidNo value 80669865/property namename value张铁钢 //bean/beans测试 最后测试一下观察PersonBean的生命周期的流转 public class Main {public static void main(String[] args) {ApplicationContext context  new ClassPathXmlApplicationContext(spring-config.xml);PersonBean personBean  (PersonBean) context.getBean(personBean);personBean.work();((ClassPathXmlApplicationContext) context).destroy();} }运行结果 1.调用构造方法我出生了 2.设置属性我的名字叫张铁钢 3.调用BeanNameAware#setBeanName方法:我要上学了起了个学名 4.调用BeanFactoryAware#setBeanFactory方法选好学校了 5.BeanPostProcessor#postProcessBeforeInitialization方法到学校报名啦 6.InitializingBean#afterPropertiesSet方法入学登记 7.自定义init方法努力上学ing 8.BeanPostProcessor#postProcessAfterInitialization方法终于毕业拿到毕业证啦 Bean使用中工作只有对社会没有用的人才放假。。 9.DisposableBean#destroy方法平淡的一生落幕了 10.自定义destroy方法:睡了别想叫醒我看看是不是和我们图中的流程一致。 这篇文章就不带大家跟进更多的源码了如果大家对源码级别的Bean的生命周期感兴趣可以看看AbstractApplicationContext类里的refresh方法这个方法是AplicationContext容器初始化的关键点。在这个方法里调用了finishBeanFactoryInitialization方法这个方法里调用了getBean方法getBean方法里调用了AbstractBeanFactory的getBean方法。 Bean生命周期源码追踪 最终经过一阵七拐八绕到达了我们的目标——Bean创建的方法doGetBean方法在这个方法里可以看到Bean的实例化赋值、初始化的过程至于最终的销毁可以看看ConfigurableApplicationContext#close()。 结语 到这这篇Bean的生命周期文章就走向destory了自定义destory方法——回顾一下这篇文章的“一生”。 Bean的生命周期大致可以分为四个阶段实例化、属性赋值、初始化、销毁对应人生的出生、登记、成长、离世。 Bean生命周期中可以有很多扩展就像人生的走向会受很多影响社会的环境、自身的选择、自己的努力。
http://www.tj-hxxt.cn/news/231084.html

相关文章:

  • 网站建设规划公司怎么样查中企动力做的网站
  • 网站建设需求网络公关公司收费
  • 明星百度指数在线查询seo的作用是什么
  • 汉川市城乡建设局网站从零开始学网站建设
  • 做视频有赚钱的网站有哪些网页设计教程
  • 宅男做网站做网站主流软件是php吗
  • 万载网站建设江门建设建筑网站
  • 做网站的技术大连市网站制作电话
  • 代理会计公司网站模版公司重名 做网站
  • 做网站好平台化新浪云平台创建wordpress
  • 申请建设单位门户网站的请示电子商务的特点
  • 上海优化网站关键词wordpress替代2017
  • 凡科做的网站户外网站建设
  • 做的最好的视频网站在安阳想建个网站怎么做
  • 如何做企业网站小程序育才网站建设
  • 中国安能建设集团有网站网站集约化建设 通知
  • 阿里云9元做网站男女这样做那个网站
  • 网站建设概政务公开 网站建设滞后
  • 苏州网站制作的公司wordpress 主题小工具
  • 郑州做企业网站互动平台论坛
  • 中国铁建商城电子商务平台网站优化推广的方法
  • 58做网站联系电话医院网站设计与实现
  • 徐州网站开发设计公司电话微信公众号配置 网站建设
  • 猎场第几集做的网站推广网站被降权会发生什么
  • 免费网站模禁止wordpress自动更新
  • 网站建设模板系统查建设工程规划许可证网站
  • 网站年报公示怎么做那个网站有题做
  • wordpress acg站江苏分销网站建设
  • 园洲做网站公司网站开发的话术
  • 一个网站里有两个网页怎么做html在wordpress中的作用