首先需要明确,默认情况下,只要在applicationContext.xml文件里面配置的时候自动进行构造方法初始化。
但是用户也可以实现自己的配置,让其在第一次使用的时候进行初始化,这种操作叫做
延迟加载
lazy-init="true"
范例:延迟加载
public class Emp { private Integer empno; private String ename; }
完整代码:
package com.Spring.Demo; public class Emp { private Integer empno; private String ename; public Emp() { System.out.println("************"); } public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } @Override public String toString() { return "Emp [empno=" + empno + ", ename=" + ename + "]"; } }
不进行延迟加载的操作配置:
<bean id="emp" class="com.Spring.Demo.Emp">
<property name="empno" value="20"/>
<property name="ename" value="Fore"/>
</bean>
正常来说只要初始化applicationContext.xml就会执行构造方法初始化。
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
结果:调用了构造方法
延迟加载配置:
<bean id="emp" class="com.Spring.Demo.Emp" lazy-init="true"> <property name="empno" value="20"/> <property name="ename" value="Fore"/> </bean>
此时执行:
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
但是结果:并没有调用构造方法。
此时表示延迟加载,当第一次使用这个bean的时候再进行加载。
如下:
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); Emp emp=ctx.getBean("emp",Emp.class);
此时执行结果:
证明此时调用了构造方法进行初始化。
除了此特征:
进行自定义的初始化和销毁方法操作:
lazy-init="true",init-method="init"
例如:现在有一个类,可以在类实例化对象的时候自动执行一个方法进行特定的初始化调用,或者在这个类对象不再需要的时候自动进行销毁方法,
进行资源的释放。
范例:观察初始化和销毁。
package com.Spring.Demo; public class Group { public void init() { System.out.println("公司进行初始化"); } public void destroy() { System.out.println("公司销毁"); } }
实际上以上两个方法只有在spring中是可以使用的,而在java运行里面,初始化会依靠构造方法,销毁会依靠finalize()方法。
配置applicationContext()文件--需要明确指定初始化以及销毁方法。
<bean id="group" class="com.Spring.Demo.Group" init-method="init" destroy-method="destroy"></bean>
执行结果:
运行了初始化操作,而没有运行销毁方法,默认情况下,初始化的操作一定会默认的自动出现,
但是销毁的操作必须明确处理。
调用过程:
package com.Spring.Demo; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestGroup { public static void main(String[] args) { ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); Group grp=ctx.getBean("group",Group.class); System.out.println(grp); ctx.registerShutdownHook();//取消注册,触发销毁 } }
注意:要想使用方法registerShutdownHook,取消注册,触发销毁事件,调用这个的ctx对象,必须是ApplicationContext类的子类:ClassPathXmlApplicationContext
实例化,父类ApplicationContext没有这个方法。
运行结果: