IOC容器从BeanFactory获取Bean源码浅析

我们经常说IOC容器,它具体由谁来充当这个角色呢,我的理解ApplicationContext是用来管理IOC容器中的Bean的,IOC容器本质上是由DefaultListableBeanFactory担当的。


我们想从容器中获得某个Bean,是通过ApplicationContext来获取的,实际实现是从容器DefaultListableBeanFactory取的,比如下面这样:

public class BeanExample {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");//创建bean
        UserService userService = (UserService) applicationContext.getBean("userService");//获取bean
        userService.hello("haha");
    }
}
<bean id="userService" class="com.hand.user.dal.UserServiceImpl" scope="prototype"/> <!--指定实例化类型为原型-->
<bean id="studentService" class="com.hand.user.dal.StudentServiceImpl"/>  <!--默认是单例-->


先看看beans.xml中定义的bean是如何实例化到Ioc容器中的。



这个过程是,把beans.xml转换为io流,通过io流来读取解析<bean>标签。将所有解析到的BeanDifinition加载到DefaultListableBeanFactory中缓存起来。最后在获取Bean时,根据BeanDifinition将Bean实例化到Ioc容器。




扫描二维码关注公众号,回复: 864328 查看本文章








这里我们获取的是原型Bean,看下它怎么取的。







说明几个概念:

ListableBeanFactory:可列表Bean工厂,是所有bean的集合(IOC容器)。

HierarchicalBeanFactory:有继承关系的Bean工厂,定义bean之间的关系。

AutowireCapableBeanFactory:自动装配Bean工厂,定义bean的行为,比如:装配Bean,解决bean之间的依赖。

默认的单例Bean,在容器初始化时,就实例化到缓存中了,只实例化一次,多次共享。

原型Bean,是在每次请求时,才实例化,所以有多个实例,是独立的。

猜你喜欢

转载自blog.csdn.net/bawcwchen/article/details/79771412