当前位置: 首页 > 后端技术 > Java

6.对象的生命周期

时间:2023-04-01 16:53:22 Java

1.什么是对象的生命周期?指对象创建、生存、消亡的完整过程。第二,为什么要学习对象的生命周期?对象的创建在代码层面很简单,但是从宏内存使用的角度来看,会影响到整个程序的运行,这会涉及到一些JVM和GC回收机制的问题。简而言之,Spring负责对象的创建、生存、销毁,了解其生命周期,将有助于我们使用Spring为我们创建的对象。3.生命周期的三个阶段Creation阶段3.1Spring工厂什么时候创建对象?scope="singleton"将Spring标签中的scope属性定义为singleton时,bean对象会与Spring工厂同时创建,即代码运行时会创建="ClassPathXmlApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");具体怎么判断呢,我们可以在类的无参构造中打印一句话,看看是否创建了scope="prototype"。设置为原型模式时,只有在Spring工厂获取到对象时才会创建对象,也就是运行这行代码的时候。="ctx.getBean("")时才会创建注意:只有创建方式选择为单例时才会创建,如果我们不想在sprigfactory创建之后创建,那么我们可以将bean标签属性的lazy-init传递给configure,当lazy属性为true时,那么只有在对象是通过Spring工厂获得的(即调用了getBean()方法)。什么是初始化?通俗的理解就是Spring在创建bean对象之后,需要做一些动作来让bean变得完美。具体内容需要程序员自行定义。Spring恰恰提供了这种可能,就像你的父母生了你一样。不完美,需要经历一些事情才能逐渐完善。下面是比较正式的解释:初始化阶段,Spring工厂创建对象后,调用对象的初始化方法完成相应的初始化操作1.初始化方法的提供:程序员根据需求2.初始化方法调用:Spring工厂调用实现初始化的形式1>ImplementInitializingBean接口,重写afterPropertiesSet()方法@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("调用LifeInit初始化方法......");}2>自己提供一个常用的方法,但是你需要定义你自己的publicclassLifeInit{publicLifeInit(){System.out.println("CreatingLifeInitobject");}//2。自定义初始化方法,在配置文件中配置相应的参数,通知spring回调即可publicvoidmyInit(){System.out.println("(自定义初始化方法)调用LifeInit初始化方法......");}}自定义bean标签,并声明init-method参数属性,值为初始化方法名3*两种形式的比较实现接口的方式与Spring框架耦合(因为接口是Spring提供的),既方便又方便在配置文件层面声明,第二种这种形式比较传统,但是多了一步,就是在配置文件中配置相应的属性。4>详细分析4.1如果一个对象不仅实现了InitializingBean接口,还提供了普通的初始化方法,那么Spring的调用顺序是怎样的?答:会先调用InitializingBean重写的方法,再调用自定义的初始化方法。这个结合生活经验也很好理解,因为毕竟用的是spring。4.2如果有注入,那么注入发生在初始化之前还是之后?羊毛布?答:发生在调用初始化方法之前结合生活经验:有一些先天的东西,比如五脏六腑这六大器官可以在未来人类的各个方面得到改善。4.3什么场景会用到初始化操作?其实从业务编程的角度来说,使用初始化的机会并不多。一般会用到一些关于资源的初始化,比如:数据库IO网络,这些操作只会做一次(其实这些操作也可以放在注入阶段)4.4结合下面类的代码,什么是调用顺序?公共类LifeInit实现InitializingBean{私有字符串名称;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){System.out.println("SpringisinjectingintoLifeBean'snameproperty....");this.name=名称;}publicLifeInit(){System.out.println("创建一个LifeInit对象");}//1。重写接口提供的方法让Spring回调方法@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("调用LifeInit初始化方法......");}//2。自定义初始化方法,在配置文件中配置相应参数通知spring回调即可publicvoidmyInit(){System.out.println("(自定义初始化方法)调用LifeInit初始化方法.......");}}上面代码的执行顺序是:①无参数构造=》②设置注入=》③afterPropertiesSet()方法初始化=》④myInit()自定义方法初始化和销毁??阶段Spring在销毁对象之前,会调用对象的销毁方法完成销毁操作。注意[before]1.Spring什么时候销毁创建的对象?目的?当我们调用ctx.close()关闭工厂,对象就会被销毁2.销毁方法是谁定义的,谁调用的?销毁方法是由程序员定义的,但是Spring调用的销毁方法有哪些形式(类似于初始化方法)呢?1.让类实现disposableBean接口publicclassLifeInitAndDestroyimplementsInitializingBean,DisposableBean{privateStringname;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){System.out.println("Spring正在处理用于注入的LifeBean属性的名称......");this.name=名称;}publicLifeInitAndDestroy(){System.out.println("创建LifeInit对象");}//1。重写接口提供的方法让Spring接口回调该方法@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("调用LifeInit初始化方法......");}//2。自定义初始化方法,在配置文件中配置相应参数告诉spring回调publicvoidmyInit(){System.out.println("(自定义初始化方法)调用LifeInit初始化方法......");}@Overridepublicvoiddestroy()throwsException{System.out.println("(Springcall)对象销毁前的操作...");}}2.定义一个普通方法,但是在配置文件的标签层告诉Spring,这是一个对象销毁的方法1.在类中定义一个普通方法publicclassLifeInitAndDestroyimplementsInitializingBean,DisposableBean{privateStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){System.out.println("SpringisinjectingthenameattributeofLifeBean...");this.name=name;}publicLifeInitAndDestroy(){System.out.println("CreatingLifeInitobject");}//1.重写接口提供的方法让Spring回调方法@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("调用LifeInit初始化方法......");}//2.自定义初始化方法,在配置文件中配置相应的参数,通知spring回调publicvoidmyInit(){System.out.println("(自定义初始化方法)调用LifeInit初始化方法...");}@Overridepublicvoiddestroy()throwsException{System.out.println("(Springcall)在销毁对象之前操作....");}//3.自定义销毁方法publicvoidmyDestroy(){System.out.println("销毁对象前的(自定义)操作...");}}2.在bean标签中指明对应的销毁方法说明:和初始化阶段类似,初始化阶段是实现一些资源的加载,销毁阶段是实现一些资源的释放;详细分析1.destructionmethodonly适用于scope=”singleton”,如果prototype不调用destruction方法,如果是初始化方法,无论是singleton还是prototype,都会被调用(记住是ctx.getBean())2.when销毁会用到吗?操作呢?主要涉及到一些资源的释放,比如:io.close(),connection.close()