正在回答 回答被采纳积分+1
1回答
芝芝兰兰
2019-10-17 14:36:49
同学你好。下面来一条条解答你的疑惑:
1、对反射通俗的理解是,将正常的new出一个对象并使用其方法的过程,给“反”了一下。指的是这段Java代码不需要new具体对象,根据类名拿到Class就可以直接使用实例。
2、耦合其实就是关联度,如果在代码中都自己来new 对象,然后使用。那么一旦这个类有了更改,那么所有曾经使用过new的位置全部要修改。这种现象就是代码耦合。要降底耦合度,就尽量将所有实例“整理”到一起集中管理。如果修改,尽量做到只改一处。这就降低了耦合度。
4、比如对于 2-3 代码实现 课程的例子,做了如下配置:
1 2 3 | < bean id = "userService" class = "com.imooc.ioc.demo1.UserServiceImpl" > < property name = "name" value = "李四" /> </ bean > |
在Spring容器中的关键步骤是这样的 ,注意只是伪代码不是实际代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //--------------------- 先实例化对象 //解析<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容器中。
如果解答了同学的疑问,望采纳~
祝学习愉快~
SSM主流框架入门与综合项目实战2018版
- 参与学习 人
- 提交作业 205 份
- 解答问题 4317 个
Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧