Spring中Bean的初始化过程

    技术2022-05-20  42

    Quotes: http://kantery.javaeye.com/blog/342206

     

    在传统的Java应用中,Bean的生命周期非常简单。Java的关键词new用来实例化Bean(或许他是非序列化的)。这样就够用了。相反,Bean 的生命周期在Spring容器中更加细致。理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。 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

    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()..." );       }   }   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.测试程序

    Java代码 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();       }   }   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代码 <? 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 >    <?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()...

     


    最新回复(0)