spring容器在进行初始化时,会将xml中配置的<bean>的信息封装成一个BeanDefination对象,所有的BeanDefination存储到一个名为BeanDefinationMap(在BeanFactory中维护)的Map集合中,Spring框架对BeanDefinationMap进行遍历,通过反射创建Bean实例对象,将创建好的对象放到一个名为singletonObjects(在BeanFactory中维护)的Map集合中,当调用getBean方法时,从singletonObject的Map集合中取出对应的实例对象Bean返回。具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置UserServiceImpl-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<!--1.name对应的值是UserServiceImpl中setUserDao的userDao 2.ref对应的值是UserServiceImpl中setUserDao方法的参数即 UserDao 对象,也就是 配置UserDaoImpl -->
<!--依赖注入DI 中 set方法注入-->
<property name="userDao" ref="userDao"></property>
</bean>
<!--配置UserDaoImpl-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
</beans>
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);
}
}
- 1.加载配置文件,解析配置中的每个<bean>信息,封装成一个个对应的BeanDefination对象(根据上面的配置文件,会生成2个BeanDefination对象);
- 2.将所有的BeanDefination对象存储在一个名为BeanDefinationMap的Map<String,BeanDefination>中;
- 3.applicationContext 底层遍历 BeanDefinationMap,创建Bean实例对象;
- 4.将创建好的Bean实例对象放到一个名为singletonObjects的Map<String,Object>中;
- 5.当执行applicationContext.getBean(beanName)方法时,在singletonObjects中根据beanName获取对应的Bean实例对象;
图解如下: