我们经常说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,是在每次请求时,才实例化,所以有多个实例,是独立的。