内容简介:下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI:平时,我们需要生成一个对象,使用new语法,如一个类为A如果我们在 B中调用A,那么如下代码:
下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI:
平时,我们需要生成一个对象,使用new语法,如一个类为A
public class A{ public void myMethod(){ System.out.println("hello"); } }
如果我们在 B中调用A,那么如下代码:
public class B{ public void invoke(){ A a = new A(); a.myMethod(); } }
每次执行invoke方法时,都要生成一个A对象,如果A对象代码较长,这是费时的事
情。于是有如下写法:
public class B{ A a = new A(); public void invoke(){ a.myMethod(); } }
将A对象变成B的类属性。 如果我们不想在B中实现A的实例,也就是不想立即new A(),而是想通过外界传入, 注意,如果你想知道为什么,这里涉及到 设计模式 以及解耦等因素,进一步感兴趣者可学习 本站的GoF 23 种设计模式。
如果想让A的实例从外界传入,有两种写法:
public class B{ A a; public void setA(A a){ this.a = a; } public A getA(){ return a; } public void invoke(){ a.myMethod(); } }
这种写法,A并没有被实例化,需要通过外界调用setA方法,将A的对象实例赋入B中. 或者通过B的构造函数传入,如下:
public class B{ A a; public B(A a){ this.a = a; } public void invoke(){ a.myMethod(); } }
上述两种写法在编程中是经常发生的,B作为调用者,A是被调用者,A的实例化不在 调用者B内部中完成,而是通过构造函数或setXXX方法赋值进来,这种方式我们称为依赖 性注射(IoC 模式),B 和A 的依赖联系是通过构造函数或setXXX 方法赋值进来,这样, 最大程度解耦了调用者B和被调用者A之间的耦合联系。
Spring如何实现依赖注射?
上文提到:A的实例化不在调用者B内部中完成,而是通过构造函数或setXXX 方法赋 值进来,Spring实际就是完成这个赋值的过程。 为了让Spring自动完成B代码中的A的实例化,需要通过配置文件告诉Spring有关A 的类的属性,这个配置是applicationContext.xml文件。 在 applicationContext.xml中,我们先定义JavaBeans为B的配置:
<beans> <bean id="b" class="springsimple.B"/> </beans>
这是最常用的JavaBeans的定义,id相当于对象名,当前文件应该是唯一。后来Spring使用@Component替代。
再在applicationContext.xml定义A的配置如下:
<beans> <bean id="b" class="springsimple.B"/> <bean id="a" class="springsimple.A"/> </beans>
这样我们告诉Spring我们有两个JavaBeans,现在解决关键问题,B代码中还调用了A, 那么如何让Spring将A的实例注射到B中?使用Spring配置的property语法。具体配置如 下:
<beans> <bean id="b" class="springsimple.B"> <property name="a"><ref local="a" /></property> <!— 增加这一行--> </bean> <bean id="a" class="springsimple.A" /> </beans>
增加一行说明:B 的属性a 指向了a,这样,Spring 会知道B 中属性a 的实例就是 springsimple.A,在B实例化时将会将B中的a 实现实例化,这是通过setA方法注射进入。 注意,property name="a"中的a 是setA字符中去掉set 后的字符串,这个字符串第一个 必须是小写,例如,如果B中有setOneA方法,那么,配置文件应该是property name="oneA"。
在Spring Boot以后版本已经可以使用@Autowire进行自动匹配,无需如此繁琐配置了。
依赖注入
Spring专题
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大规模Web服务开发技术
伊藤直也、田中慎司 / 李剑 / 电子工业出版社 / 2011-7 / 59.00元
Hatena是日本最大的Web服务提供商之一,它提供的服务包括关键字(类似于维基百科)、博客、相册等。《大规模Web服务开发技术》由伊藤直也、田中慎司所著,内容主要来自Hatena为学生们举行的暑期实习的课程,内容涵盖广泛,介绍了性能优化、分布式、算法、系统架构等各个方面,甚至还介绍了硬件的经济成本,是运维工程师们必不可少的参考书。书中还包括几个算法实习课题,介绍了压缩算法、全文搜索等算法的实现方......一起来看看 《大规模Web服务开发技术》 这本书的介绍吧!
MD5 加密
MD5 加密工具
HEX CMYK 转换工具
HEX CMYK 互转工具