posts - 64,  comments - 9,  trackbacks - 0

在Spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每个Bean的别名只维持一个实例。因此会存在资源共享的问题。如需要,则可以将其设置为”singleton=false”。

在这里要注意的是此singleton的设置只是针对单一的配置文件而言,也就是说,如果存在多个BeanFactory或ApplicationContext,即使将singleton设置为false,也会存在资源共享的问题。

下面来说下Bean的生命周期:

l        Bean的建立

有BeanFactory读取Bean定义文件,并生成各个Bean实例

l        属性注入

执行相关的Bean属性依赖注入

l        BeanNameAware的setBeanName()

如果Bean类有实现BeanNameAware接口,则执行他的setBeanName()方法。

l        BeanFactoryAware的setBeanFactory()

如果Bean类有实现BeanFactoryAware接口,则执行他的setBeanFactory()方法

l        BeanPostProcessors的processBeforeInitialization()

如果任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的processBeforeInitialization()方法

l        initializingBean的afterPropertiesSet()

l        如果Bean类已实现了org.springframework.beans.factory.InitializingBean接口,则执行它的afterPropertiesSet()方法。

l        Bean定义问教案中定义的init-method

可以在Bean定义文件中使用”init-method”属性设定方法名称,进入这个阶段,就会执行initBean()方法。

l        BeanPostProcessors的processAfterInitialization()

如果任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的processAfterInitialization()方法

l        DisposableBean的destroy()

在容器关闭时,如果Bean类有实现org.springframework.beans.factory.

DisposabelBean接口,则执行它的destroy()方法

l        Bean定义文件中定义的destroy-method

可以在Bean定义文件中使用” destroy-method”属性设定方法名称,进入这个阶段,就会执行destroyBean()方法。

以上是BeanFactory管理Bean的方法,如果采用ApplicationContext管理,则会稍有不同。使用ApplicationContext来生成和管理Bean实例的话,在执行BeanFactoryAware的SetBeanFactory()阶段之后,若Bean类上有实现ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才继续进行BeanPostProcessors的processBeforeInitialization()及之后的流程。

下面就给出一简单demo,以供参考:

public class CommonBean implements BeanNameAware, BeanFactoryAware,

       ApplicationContextAware, BeanPostProcessor {

    public void setBeanName(String name) {

       System.out.println("This is setBeanName method!");

    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

       System.out.println("This is setBeanFactory method!");

    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

       System.out.println("This is setApplicationContext method!");

    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

       System.out.println("This is postProcessAfterInitialization method!");

       return bean;

    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

       System.out.println("This is postProcessBeforeInitialization method!");

       return bean;

    }

    public void initBean(){

       System.out.println("This is initBean method!");

    }

    public void destroyBean(){

       System.out.println("This is destroyBean method!");

    }

}

在context.getBean(“commonBean”)执行时,输出结果:

This is setBeanName method!

This is setBeanFactory method!

This is setApplicationContext method!

This is initBean method!

This is postProcessBeforeInitialization method!

This is postProcessAfterInitialization method!

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/prince2270/archive/2008/09/27/2986231.aspx

posted on 2009-08-26 14:28 super_nini 阅读(213) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜