浏览 6560 次
锁定老帖子 主题:Spring中Bean的初始化过程
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-03
最后修改:2009-03-03
1. 容器寻找Bean的定义信息并且将其实例化。 2.受用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。 3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。 4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。 5.如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()方法将被调用。 6.如果Bean指定了init-method方法,它将被调用。 7.最后,如果有BeanPsotProcessor和Bean关联,那么它们的postProcessAfterInitialization()方法将被调用。 到这个时候,Bean已经可以被应用系统使用了,并且将被保留在Bean Factory中知道它不再需要。有两种方法可以把它从Bean Factory中删除掉。 1.如果Bean实现了DisposableBean接口,destory()方法被调用。 2.如果指定了订制的销毁方法,就调用这个方法。 Bean在Spring应用上下文的生命周期与在Bean工厂中的生命周期只有一点不同,唯一不同的是,如果Bean实现了ApplicationContextAwre接口,setApplicationContext()方法被调用。 举例:(这里只是演示Bean工厂的例子) 我这里用的是spring-1.2.6,由于版本原因吧,这里演示的不是很好! 1.HelloWorld.java package com.spring.lifecycle; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanPostProcessor; public class HelloWorld implements BeanNameAware,BeanFactoryAware, BeanPostProcessor,InitializingBean,DisposableBean{ private String hello; public void setBeanName(String arg0) { System.out.println("调用BeanNameAware的setBeanName()..." ); } public String getHello() { return hello; } public void setHello(String hello) { this.hello = hello; System.out.println("调用setHello()..." ); } public void customInit() { System.out.println("调用customInit()..."); } public void customDestroy() { System.out.println("调用customDestroy()..."); } public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { System.out.println("调用BeanPostProcessor的postProcessAfterInitialization()..."); return null; } public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { System.out.println("调用BeanPostProcessor的postProcessBeforeInitialization()..."); return null; } public void destroy() throws Exception { System.out.println("调用DisposableBean的destory()..."); } public void afterPropertiesSet() throws Exception { System.out.println("调用InitializingBean的afterPropertiesSet()..."); } public void setBeanFactory(BeanFactory arg0) throws BeansException { System.out.println("调用BeanFactoryAware的setBeanFactory()..."); } } 2.测试程序 package com.spring.springtest; import junit.framework.TestCase; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.lifecycle.HelloWorld; public class TestLifeCycle extends TestCase { private BeanFactory bf; protected void setUp() throws Exception { bf = new ClassPathXmlApplicationContext("applicationContext.xml"); } public void testLifeCycle() throws Exception { HelloWorld hello = (HelloWorld) bf.getBean("helloWorld"); assertEquals("hello world!", hello.getHello()); hello.destroy(); } } 3.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorld" class="com.spring.lifecycle.HelloWorld" init-method="customInit" destroy-method="customDestroy"> <property name="hello" value="hello world!"></property> </bean> </beans> 4.运行结果: 引用 调用setHello()...
调用BeanNameAware的setBeanName()... 调用BeanFactoryAware的setBeanFactory()... 调用InitializingBean的afterPropertiesSet()... 调用customInit()... 调用DisposableBean的destory()... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-10-13
呵呵 !~ 很高兴和你交流~ 我现在请教一个问题啊 ~
<bean id="helloWorld" class="com.spring.lifecycle.HelloWorld" init-method="customInit" destroy-method="customDestroy" depends-on="sysInitBean"> <property name="hello" value="hello world!"></property> </bean> 如果这个bean依赖于某一个bean的话depends-on="sysInitBean" 这个时候我需要在init-method="customInit"这个初始化方法里面得到 所依赖的bean(sysInitBean)的信息,如一个字符串。 在customInit方法里该如何调用sysInitBean呢?这个问题很困扰,不知道如何解决~! |
|
返回顶楼 | |