工厂+反射+配置文件体现在哪儿呢?

来源:2-3 代码实现

96年的nash

2019-05-23 09:21:18

我的问题是这三项在这个实例中分别代表哪些步骤呢?

写回答

1回答

芝芝兰兰

2019-05-23

同学你好。这三者其实是不可分割的,IOC的关键就是BeanFactory工厂,它来代替我们创建bean,使用它创建出工厂(ApplicationContext是BeanFactory的子接口),使用getBean来获取,而不是自己去new,就是工厂模式的体现。而这个工厂之所以能够创建这个bean,就是因为它读取了我们传入的配置文件,根据配置信息利用反射创建了对应类的实例。

比如:

<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl">
        <property name="name" value="李四"/>
</bean>

在容器中的关键步骤是这样的 ,注意只是伪代码不是实际代码:

//--------------------- 先实例化对象
//解析<bean .../>元素的id属性得到该字符串值为“userService”
String idStr = "userService";
//解析<bean .../>元素的class属性得到该字符串值为“com.imooc.ioc.demo1.UserServiceImpl”
String classStr = "com.imooc.ioc.demo1.UserServiceImpl";
//利用反射知识,通过classStr获取Class类对象
Class<?> cls = Class.forName(classStr);
//实例化对象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);
//--------------------- 下面注入属性值
//解析<property .../>元素的name属性得到该字符串值为“name”
String nameStr = "name";
//生成将要调用setter方法名
String setterName = "set" + nameStr.substring(0, 1).toUpperCase()
  + nameStr.substring(1);
//获取spring容器中名为value的值转换为Object对象,将会作为传入参数
Object paramBean = (Object)"李四";
//获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象
Method setter = cls.getMethod(setterName, paramBean.getClass());
//调用invoke()方法,此处的obj是刚才反射代码得到的Object对象
setter.invoke(obj, paramBean);

通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring bean的bean容器中。

如果解答了同学的疑问,望采纳~

祝学习愉快~


1

0 学习 · 8263 问题

查看课程