老师,问几个问题?

老师,问几个问题?

老师,这里用到了反射?
还有什么是耦合?
依赖注入为什么能降低耦合?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
芝芝兰兰 2019-10-17 14:36:49

同学你好。下面来一条条解答你的疑惑:

1、对反射通俗的理解是,将正常的new出一个对象并使用其方法的过程,给“反”了一下。指的是这段Java代码不需要new具体对象,根据类名拿到Class就可以直接使用实例。


2、耦合其实就是关联度,如果在代码中都自己来new 对象,然后使用。那么一旦这个类有了更改,那么所有曾经使用过new的位置全部要修改。这种现象就是代码耦合。要降底耦合度,就尽量将所有实例“整理”到一起集中管理。如果修改,尽量做到只改一处。这就降低了耦合度。


4、比如对于 2-3 代码实现 课程的例子,做了如下配置:

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

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

//--------------------- 先实例化对象
//解析<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容器中。


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

祝学习愉快~


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师