问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring 依赖注入怎么来理解?

发布网友 发布时间:2022-04-06 02:06

我来回答

4个回答

热心网友 时间:2022-04-06 03:36

所谓依赖,举个例子说明,一个类Person,另一个类Car,如果Person的某个方法比如说drive,需要引用Car,则称Person类依赖于 Car类,延伸到对象,这种依赖关系依然成立,比如说Person类的对象boy依赖于Car类的对象toyota。再讲讲这个drive方法的实现,假定代码如下:
Public Person{
...
public void drive(){
Car toyota=new Car("TOYOTA");
toyota.挂档;
toyota.踩油门;
toyota.打方向;
}
}
这其中的依赖关系,就导致了对象boy需要负责对象toyota的创建,甚至是整个生命周期的管理,而这样显然会带来耦合度高,不易维护等缺点,比如说要让这个男孩驾驶一辆Audi,则还需要修改类Person的代码。
因此在java的设计理论中就提出了一条非常著名的原则,依赖倒转原则(Dependence Inversion),其核心思想就是要将这种具体类之间的依赖,尽量转换成抽象依赖,也就是说类Person应该依赖于抽象类ICar,而不是具体的类 Car,这里java就大力推荐了抽象和接口的使用,至于抽象和接口之间的区别,任何一本JAVA书籍都有介绍,这里就不再说了。

这个依赖倒转原则在设计模式也体现得非常多,比如说工厂模式和构建模式,个人认为控制反转IoC,其实也可以认为是实现这个原则的一种设计模式。控制反转,其中的控制这个词一直不太理解是什么意思,不过控制反转的另外一种说法也就是依赖注入(dependence injection),个人觉得更易于理解。还是以上文的boy与toyota为例,其核心就是要将boy依赖的对象toyota注入到boy中去,而无需boy自己去引用toyota,这个注入的过程,通常是由一个控制程序来完成的,无需对象去关心,举例如下:
Public Person{
private ICar car;
public Person(ICar onecar){
car=onecar;
}
public void drive(){
car.挂档;
car.踩油门;
car.打方向;
}
}
这个时候,进行注入并且调用的过程,就很简单了,如下:
Toyota toyota=new Toyota();
Person boy=new Person(toyota);
boy.drive();
注:这里我们假定,Toyota类是ICar接口类的一个具体实现。
这个例子就演示一个最简单的注入方式的例子,也就是构造子方式注入,通过将依赖对象注入到对象的构造子中来实现。另外还有一种常用的注入方式,就是属性方式注入,意思就是通过将依赖对象注入到对象的属性中来实现,还是以boy和toyota的例子说明,如下:
Public Person{
private ICar car;
public Person(){
}
public void drive(){
car.挂档;
car.踩油门;
car.打方向;
}
public ICar getCar(){
return this.car;
}
public void setCar(ICar onecar){
car=onecar;
}
}
这个时候,进行注入并且调用的过程,就变成如下所示:
Toyota toyota=new Toyota();
Person boy=new Person();
boy.setCar(toyota);
boy.drive();
至此依赖注入的概念应该比较清楚了,再来看看在Spring中如何实现IoC的,看看Spring如何作为一个成熟的IoC容器,Spring中其实主要通过两个概念来实现IoC,首先通过XML配置文件,将对象和依赖对象都配置到某个XML文件中,当然该XML文件需要符合Spring指定的规范,然后通过架构中的BeanFactroy类,来自动实现上文所述注入过程,还是以boy与toyota为例,如下:
首先,Person类还是一样的,
然后xml配置文件增加点东西-(假定为bean.xml):
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="oneCar" class="Toyota"> <!-- Toyota类是ICar的一个实现-->
</bean>
<bean id="onePerson" class="Person"> <!--本例以属性方式注入为例 -->
<property name="car">
<ref bean="oneCar"></ref>
</property>
</bean>
</beans>
最后,调用的过程,就变成如下:
BeanFactory factory=new XmlBeanFactory("bean.xml");
Person boy=(Person )factory.getBean("onePerson");
boy.drive();
--不知是否讲清楚了,呵呵

参考资料:http://www.javago.net/spring/26.html

热心网友 时间:2022-04-06 04:54

我的理解(设有A、B两个类)
依赖:一个类(A)对另一个类(B)的依赖,也就是一个类需要调用到另一个类
注入:把另一个类(B)注入到类(A)中,以供A使用,不再像以前那样在A类中
new出B类,解了耦合。

热心网友 时间:2022-04-06 06:28

依赖注入:并不是那么复杂.
A类和B类,如果A要用到B
在A类中加一个setB()就OK了,再通过spring的IOC容器实例化好的对象用属性注入就OK了

热心网友 时间:2022-04-06 08:20

就是别人弄好了给你让你用
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蛋上有疙瘩怎么回事 姻缘测试:属虎和属兔的合不合 婚姻怎么样 电脑能上网手机连上wifi不能上网? 为什么手机连上电脑WIFI却上不了网呢 win7开机黑屏安全模式正常是怎么回事 win7开机黑屏安全模式正常问题解 ... 电脑开机安全模式能进电脑可以进安全模式但正常系统为什么进不去 ...进笔记本电脑安全模式能开机但是正常模式开机黑屏 电脑开机黑屏但安全模式能进去电脑开机一启动系统就黑屏进安全系统正常... 12月份女生面试应该穿什么? 我想去哈尔滨玩几天,大概在十二月中旬,穿什么才不会被冻着?大概需要多... java中的控制反转是什么意思? 如何理解spring的控制反转ioc 关于spring.什么是控制反转和依赖注入 Spring 的依赖注入是什么意思? spring控制反转和依赖注入的区别 iphone6plus充满电老是有提示音怎么办? iphone6充电震动两次怎么回事? iphone6充电震动两次怎么回事 苹果充电提示音怎么关闭通知 Mac充电一直弹出提示音 现在可以免费看小说的浏览器好用的有哪些,别只有一点点书的 最好的免费浏览器 什么浏览器看电视不用vip 苹果更新后充电提示音怎么弄 苹果7充电突然没声音了怎么回事? 苹果手机插车上充电没声音? 苹果手机提示音怎么突然没有了? iphone12promax为什么无线充电没有声音 苹果8S手机短启动信息、充电、拍照等功能时突然没有提示音了,不知道如何解决,求助! 为什么苹果6S充电每次到百分之90以上就开始一直有提示音呢 如何通俗的理解java的依赖注入 什么是依赖注入依赖注入的作用是什么意思 高手近来啊!批处问题啊 excel kill是什么病毒?用什么杀毒软件啊?不懂注册表操作 通过注册表优化系统 注册表是什么东东? 我是学土木工程的, 从发展上来看,刚开始究竟是进中建好还是私企好?还是一些效益还不错的小公司好呢? 怎样认识注册表? 什么是注册表?《想要一个全面的答案》,谢谢! 请问用注册表能做些什么呢? 注册表是什莫? 摩尔庄园所有攻略 什么是注册表 java 单例模式(单一设计模式)怎么保证的只能生成一个实例?求更具体的解释 spring主要运用那些设计模式?单例模式是怎么实现的? tp框架是什么 thinkphp3.2框架配置文件config.php文件的结构是什么,写出mysql数据库的配置 php学了tp框架后有问题咋办呢,解决难度好大呢?求帮助 tp框架搭建的后台文章添加功能怎么做 为什么我tp框架连接数据库报错