1. 程式人生 > >beanFactory和ApplicationContext的區別和關係

beanFactory和ApplicationContext的區別和關係

beanFactory和ApplicationContext的區別和關係:

ApplicationContext建立在BeanFactory的基礎之上,提供了更多面嚮應用的功能, 它提供了國際化支援和框架事件體系,但有下面幾點不同:

1)獲取beanFactory和ApplicationContext方式不同

BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource(“applicationContext.xml”));
beanFactory.getBean(“mybean”);//得到bean
ApplicationContext ac=new ClassPathXmlApplicationContext("com/bean/factory/spring.xml");
Students student1=ac.getBean("student");

2)都可以獲取bean,獲取bean存在的區別:

BeanFactory在初始化容器時,並沒有例項化Bean,直到第一次訪問某個Bean時才例項化目標Bean。 
ApplicationContext會在初始化應用上下文時就例項化所有單例項的Bean。

3)對BeanPostProcessor中的方法呼叫方式不同。這裡先有文字說明具體例項在下面介紹BeanPostProcessor的時候介紹

若使用BeanFactory,則必須要顯示的呼叫其addBeanPostProcessor()方法進行註冊,引數為BeanPostProcessor實現類的例項,並進行手動呼叫。
如果是使用ApplicationContext,那麼容器會在配置檔案在中自動尋找實現了BeanPostProcessor介面的Bean,然後自動註冊,我們要做的只是配置一個BeanPostProcessor實現類的Bean就可以了。

例項程式碼如下:

先有BeanPostProcessor的實現類

@Component
public class PostProcessorImpl implements BeanPostProcessor {


    public  void  meythod1(){
        System.out.println("PostProcessorNew ===do -----");
    }
    
    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("PostProcessorImpl---before----"+s);
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("PostProcessorImpl---after----"+s);
        return o;
    }
}

然後是BeanPostProcesssor的使用

//        beanFactory呼叫BeanPostProcessor的方法的方式需要四步
//      1 獲取BeanFactory
        XmlBeanFactory ac=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//        2 獲取bean例項
        Object postProcessor = ac.getBean("postProcessorImpl");
//        3 註冊beanPostProcessor
        ac.addBeanPostProcessor((BeanPostProcessor) postProcessor);
//        4 手動呼叫
        ac.applyBeanPostProcessorsAfterInitialization(postProcessor,"postProcessorImpl");

        // 上下文只需要下面一行程式碼就會自動呼叫BeanPostProcessor的方法
//        ApplicationContext ac=new ClassPathXmlApplicationContext( new String[]{"applicationContext.xml"});