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"});