目录
一、BeanFactory与ApplicationContext的区别
五、通过继承ApplicationObjectSupport
六、通过继承WebApplicationObjectSupport
七、通过WebApplicationContextUtils
一、BeanFactory与ApplicationContext的区别
BeanFactory是Spring框架的基础设施,面向Spring本身。ApplicationContext则面向使用Spring框架的开发者,几乎所有的应用场景都可以直接使用ApplicationContext,而非底层的BeanFactory。
ApplicationContext的初始化和BeanFactory有一个重大的区别:
BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean,相对应的,ApplicationContext的初始化时间会比BeanFactory长一些。
二、通过BeanFactory获取
通过BeanFactory来获取Bean。
基于xml配置文件:(不推荐使用)
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
User user = (User) beanFactory.getBean("user");
三、通过BeanFactoryAware获取
获取BeanFactory实例最简单的方式就是实现BeanFactoryAware接口。
BeanFactoryAware接口源码:
public interface BeanFactoryAware extends Aware {
?/**
??* 初始化回调方法,Spring会自动将BeanFactory注入进去,接收之后即可使用BeanFactory
??*/
?void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
BeanFactoryAware属于org.springframework.beans.factory.Aware根标记接口,使用setter注入来在应用程序上下文启动期间获取对象。Aware接口是回调,监听器和观察者设计模式的混合,它表示Bean有资格通过回调方式被Spring容器通知。
示例如下:
@Component
public class BeanFactoryHelper implements BeanFactoryAware {
?private static BeanFactory beanFactory;
?/**
??* 重