工厂+反射+配置文件体现在哪儿呢?
来源:2-3 代码实现
96年的nash
2019-05-23 09:21:18
我的问题是这三项在这个实例中分别代表哪些步骤呢?
1回答
同学你好。这三者其实是不可分割的,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容器中。
如果解答了同学的疑问,望采纳~
祝学习愉快~
相似问题