BeanFactory和ApplicationContext谁才是SpringIoC容器?

Spring-framework 官方文档

在这里插入图片描述

简单翻译

在org.springframework.beans和org.springframework.context包是Spring框架的IoC容器的基础。该 BeanFactory 界面提供了一种高级配置机制,能够管理任何类型的对象「这里提到的是管理对象,不是管理Bean」。ApplicationContext 是的子接口BeanFactory。它增加了:

  • 与Spring的AOP功能轻松集成
  • 消息资源处理(用于国际化)
  • 事件发布应用层特定的上下文,例如WebApplicationContext 用于Web应用程序中的。

简而言之,BeanFactory提供了配置框架和基本功能,并ApplicationContext增加了更多针对企业的功能。该ApplicationContext是对一个完整的超集BeanFactory,并在Spring的IoC容器的描述本章独占使用。有关使用的详细信息BeanFactory,而不是ApplicationContext,看到 的BeanFactory。在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。否则,bean仅仅是应用程序中许多对象之一。Bean及其之间的依赖关系反映在容器使用的配置元数据中
在这里插入图片描述

在这里插入图片描述

BEANFACTORY 作为IOC容器

/**
 * {@link BeanFactory} 作为 IoC 容器示例
 *
 * @author lisz (shangzhi.ibyte@gmail.com)
 */
public class BeanFactoryAsIoCContainerDemo {
 
    public static void main(String[] args) {
        // 创建 BeanFactory 容器
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        // XML 配置文件 ClassPath 路径
        String location = "classpath:/META-INF/dependency-lookup-context.xml";
        // 加载配置
        int beanDefinitionsCount = reader.loadBeanDefinitions(location);
        System.out.println("Bean 定义加载的数量:" + beanDefinitionsCount);
        // 依赖查找集合对象
        lookupCollectionByType(beanFactory);
    }
 
    private static void lookupCollectionByType(BeanFactory beanFactory) {
        if (beanFactory instanceof ListableBeanFactory) {
            ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
            Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
            System.out.println("查找到的所有的 User 集合对象:" + users);
        }
    }
}

APPLICATIONCONTEXT 作为IOC容器

/**
 * 注解能力 {@link ApplicationContext} 作为 IoC 容器示例
 *
 * @author lisz (shangzhi.ibyte@gmail.com)
 */
@Configuration
public class AnnotationApplicationContextAsIoCContainerDemo {
 
    public static void main(String[] args) {
        // 创建Bean容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 将当前类 AnnotationApplicationContextAsIoCContainerDemo 作为配置类(Configuration Class)
        applicationContext.register(AnnotationApplicationContextAsIoCContainerDemo.class);
        // 启动应用上下文
        applicationContext.refresh();
 
        // 依赖查找集合对象
        lookupCollectionByType(applicationContext);
 
        // 关闭应用上下文
        applicationContext.close();
    }
 
    /**
     * 通过 Java 注解的方式,定义了一个 Bean
     */
    @Bean
    public User user() {
        User user = new User();
        user.setId(1L);
        user.setName("小码哥");
        return user;
    }
 
    private static void lookupCollectionByType(BeanFactory beanFactory) {
        if (beanFactory instanceof ListableBeanFactory) {
            ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
            Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
            System.out.println("查找到的所有的 User 集合对象:" + users);
        }
    }
}

总结

官方文档以及结合源码简要分析难发现 BeanFactory和ApplicationContext其实是统一类事物,只不过在底层实现的时候ApplicationContext组合了一个 BeanFactory实现,所以我们要区分出来这两者管理,如果应用中我们得到ApplicationContext 记得调用getBeanFactory 方法获取真正底层实现而非而非直接进行替换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值