ApplicationContext 与 BeanFactory 与 FactoryBean
一、ApplicationContext 和 BeanFactory 的区别
ApplicationContext 包含 BeanFactory(ApplicationContext:项目,BeanFactory:工具类),BeanFactory提供了一些对bean管理的基础功能,比如:获取Bean,注册Bean,获取beanDefinition对象,注册beanDefinition对象等。但包扫描,bean的命名等BeanFactory无法提供。
- BeanFactory与ApplicationContext是spring的两大核心接口,都可以当做spring的容器.
- ApplicationContext 面向使用Spring 框架的开发者, ApplicationContext 使用的“场合”较多
- BeanFactory是Spring中最底层的接口,是IOC的核心,其功能包含了各种Bean的定义、加载、实例化、依赖注入和生命周期的管理。是IOC最基本的功能。如Bean的注册(
beanFactory.registerSingleton(“bean5”,new Bean5()); ) - ApplicationContext是BeanFactory的子接口,对BeanFactory进行了扩展,具有BeanFactory所有的功能。支持国际化、资源文件访问、载入多个上下文配置文件,如:扫描、Bean名字的自定义
- BeanFactory采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
- ApplicationContext,它时在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所有的单例Bean,通过预载入单例Bean,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
二、BeanFactory 和 FactoryBean 的区别
- BeanFactory是一个容器对象,提供了我们对Bean的基本管理,如:getBean()、beanFactory.registerSingleton(“bean5”,new Bean5());
- FactoryBean本身是一个Bean,具有 getObject() 和 getObjectType() 方法,会返回一个非自身的Bean
三、FactoryBean的特点
- 本身MyFactoryBean是一个bean 可以通过getBean获取
- 可以返回一个bean(非本身bean)
- 可以被spring识别
- 如果通过getBean(beanName)获取,返回的是getObject返回的对象
- getBean(&beanName)获取的是本身bean(即MyFactoryBean)
MyFactoryBean(实现FactoryBean接口)
@Component
public class MyFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new E();
}
@Override
public Class<?> getObjectType() {
return E.class;
}
}
测试
@Test
public void TestBean5() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
log.debug("无&:{}",context.getBean("myFactoryBean"));
log.debug("有&:{}",context.getBean("&myFactoryBean"));
}