Spring之beanFactory和applicationContext的区别

目录

 一、beanFactory和applicationContext的说明

 二、beanFactory和applicationContext的区别


一、beanFactory和applicationContext的说明

       在Spring中,IoC(Inversion of Control:控制反转)容器主要有两种实现方式:

  • BeanFactory: 是Spring框架最基本的IoC容器,提供了基本的IoC功能。但是,BeanFactory的功能相对较为简单,实现更偏向底层。实现代码如下:
    !--配置UserDaoImpl-->
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
    public class BeanFactoryTest {
        public static void main(String[] args) {
            //1.创建工厂对象
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            //2.创建读取器,绑定bean工厂
            XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
            //3.读取beans.xml给工厂
            reader.loadBeanDefinitions("beans.xml");
            //4.根据id获取UserDao对象
            UserDao userDao = (UserDao) beanFactory.getBean("userDao");
            System.out.println(userDao);
        }
    }

    通过BeanFactory实现IOC的方式,属于延迟加载:即当调用beanFactory.getBean("userDao")时,容器才会实例化对应的bean对象,放在BeanFactory对象维护下的单例池(singletonObject)中进行管理。如下图:

  • ApplicationContext: 是BeanFactory的子接口,在实现BeanFactory功能的同时提供了更多的功能,包括事件传播、AOP等。ApplicationContext是Spring中常用的IoC容器。代码实现如下:
    <!--配置UserDaoImpl-->
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
    
    public class ApplicationContextTest {
        public static void main(String[] args) { 
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserDao userDao = (UserDao) applicationContext.getBean("userDao");
            System.out.println(userDao);
    
        }
    }

    与BeanFactory实现方式不同,applicationContext容器创建后就会实例化bean对象,并将实例化对象放到applicationContext引用的BeanFactory对象维护下的单例池(singletonObject)中进行管理(applicationContext方式,底层实际也是通过BeanFactory来实例化并管理对象的)

 二、beanFactory和applicationContext的区别

        beanFactory和applicationContext两种方式都实现了将创建和管理对象交给spring容器来控制,不需要在通过new的方式来创建对象,在需要的时候直接将对象注入到相应的地方即可。下面是2种实现方式的区别:

  • beanFactory 是spring早期接口,称之为spring的bean工厂,applicationContext 是后期更高级的接口,称之spring容器
  • applicationContext 在 beanFactory 基础上对功能进行了扩展,例如监听功能、国际化功能等,beanFactory 的 API 更偏向底层,applicationContext 的 API 大多数是对这些底层 API 的封装
  • Bean创建的主要逻辑和功能都被封装在 beanFactory 中,applicationContext 不仅继承了 beanFactory ,而且 applicationContext 内部还维护着beanFactory的引用,所以 applicationContext 和 beanFactory 既有继承关系,又有融合关系
  • Bean的初始化时机不同,原始 beanFactory 是在首次调用 getBean 时才会进行bean的创建,而 applicationContext 则是在加载配置文件,容器创建后就将bean实例化并初始化完成。

如图所示:更加直观的体现了2者的关系

  • b6e4e296c79d4f83a8ee301c69e7f0c3.png
 
 
 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值