Spring依赖注入
Spring的一个核心概念就是控制反转,也叫依赖注入,也就是Bean的实例化交给Spring的Bean容器去做
示例
使用Spring容器初始化一个对象,并调用对象里面的方法
JavaBean
1 | public class Student { |
spring-context.xml配置
1 | <bean id="student" class="com.dxj.Student"> |
单元测试
1 |
|
输出
邓湘军学习
解释
读取配置文件spring-context.xml的内容,解析bean标签,在调用beanFactory.getBean方法的时候,使用反射机制实例化对象
源码剖析
要通过配置文件的方式创建Bean,需要读取xml文件,并解析xml中的bean标签,然后再通过解析后的结果生成一个对象。
首先,看代码1
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanEvents.xml"));
代码时序图如下
通过new ClassPathResource对象来构造Resource对象,后续通过Resource对象来初始化BeanFactory,new ClassPathResource对象时配置好路径和类加载器,这样可让后续XmlBeanFactory实例化的时候通过输入流读取xml文件,这里使用的类加载器是AppClassLoader。1
2
3
4
5
6
7
8
9public ClassPathResource(String path, ClassLoader classLoader) {
Assert.notNull(path, "Path must not be null");
String pathToUse = StringUtils.cleanPath(path);
if (pathToUse.startsWith("/")) {
pathToUse = pathToUse.substring(1);
}
this.path = pathToUse;
this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader());
}
XmlBeanFactory中有个成员变量XmlBeanDefinitionReader,这个reader负责读取xml文件,如图
解析完后,beanFactory的成员变量beanDefinitionMap会存储解析的bean标签,如图5在后续调用beanFactory的getBean方法时,就能从工厂去取bean(如果工厂里没有实例化,则会进行实例化)。
在这个示例中,因为默认使用懒加载,那么第一次调用beanFactory的getBean会实例化bean。