【spring】IOC的初步理解
来源:互联网 发布:js设置css样式属性 编辑:程序博客网 时间:2024/05/21 19:45
Spring框架的核心就是控制反转(Inversion of Control)和依赖注入(Dependency Injection),通过这两方面来实现松耦合。
使用IoC,对象是被动的接受依赖类,而不是自己主动的去找。容器在实例化的时候主动将它的依赖类注入给它。
可以这样理解:控制反转将类的主动权转移到接口上,依赖注入通过xml配置文件在类实例化时将其依赖类注入。通过下面的实例来逐步的理解:
首先假设有一个需求,类Business需要调用类Dependency的方法f(),按照日常的做法,得到下面的代码:
//**类Dependency**public class Dependency {public void f() {};}//**类Business**publicclass Business {Dependency d;public Business() {d = new Dependency();}public void doSth() {d.f();}}
在这里 Business 是显式依赖于Dependency类的,这样紧密的耦合性不是我们所希望看到的。所以首先应该想到的是 将依赖类改为依赖接口。
对上述实现做出如下修改:
首先,将Business里的Dependency实例的获得该为setter方式,其次,将Dependency类改为某个接口的实现。故可以得到下面新的代码:
//**接口IDependency**public interface IDependency {void f();}//**类Dependency**public class Dependency {public void f() {};}//**类Business**publicclass Business {IDependency d;public Business() {}public void doSth() { d.f();}public void setDependency(IDependency d) {this.d = d;}}
以上代码如果写一个测试 类的话 还是需要先 new 一个Dependency对象出来,然后set给Business对象。考虑用工厂模式。
public class BusinessFactory{ public static Business getBusiness(){IDependency dependency = new Dependency();
Business business = new Business();
business.setDependency(dependency);}}
这样我们借助于依赖注入(工厂类)实现了反转控制。
在新的代码中,首先Business的变量d可以接收任何IDependency的实例,另外,Dependency的实例不是通过Business来获得,而是通过setter(也可以用构造器)来由外部传给它。这似乎跟我们往常的代码没什么不同,但这已经是一个良好的设计。关键就是Dependency的实例如何从外部注入给Business呢?
这就要通过xml来实现了。
创建一个SpringFirst.xml,进行简单的配置:
<beans><bean id = "dependency" class = "aopfirst.business.Dependency" /><beanid = "business"class = "aopfirst.business.Business"><property name = "dependency"><ref bean = "dependency" /></property></bean></beans>
这个配置文件里将Dependency类和Business类加入,并将Dependency作为Business的一个参数。
单有了这个xml文件还不够,还需要一个测试类来加载该xml文件,spring提供了现成的API,在加载上面的xml的时候,就进行了如下工作:实例化Dependency类,实例化Business类,并将Dependency的实例作为参数赋给了Business实例的
setDependency()方法。下面是该测试程序:
public class StartServer {public static void main(String [] args) { ClassPathResource cr = new ClassPathResource("SpringFirst.xml"); BeanFactory factory = new XmlBeanFactory(cr); Business b = (Business)factory.getBean("business"); b.doSth();}}
上面的程序加载了xml以后,获得id为"business"的bean,即Business类的实例,并调用了其doSth()方法。由此可见,Business的依赖类Dependency是通过xml来注入的,而且Business是通过接口IDependency来接收Dependency实例。因此,当我们又有新的IDependency的实现时,只需要修改xml文件即可,测试程序只需要根据xml里的id值来获得需要的参数。
总结上面的例子,对控制反转和依赖注入已经能理解了。依赖类(Dependency)是通过外部(xml)来注入的,而不是由使用它的类(Business)来自己制造,这就是依赖的注入。另一方面,Business对类Dependency的依赖转移到对接口IDependency的依赖,控制权由类转移到了接口,即由"实现"转移到"抽象"中。这就是控制反转。
- 【spring】IOC的初步理解
- Spring Framework IoC以及DI的初步理解和实现
- Spring IOC的初步进阶
- spring IOC的理解
- spring IOC的理解
- Spring IOC 的理解
- spring Ioc的理解
- Spring IOC的理解
- spring ioc的理解
- spring ioc的理解
- 初步理解spring ioc原理(读完可自己实现依赖注入部分的spring框架)
- IoC初步理解
- spring ioc我的理解
- Spring IoC/DI的理解
- 对Spring IOC的理解
- Spring的IOC图形理解
- spring框架(IOC)的理解
- 深度理解spring的IOC
- Linux Shell 通配符、元字符、转义符使用实例介绍
- Struts2 标签库(上)[Tablib]
- smartform 打印预览时转PDF查看
- Visual Basic 2008 中函数的定义与调用
- 关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
- 【spring】IOC的初步理解
- ABAP程序注释模板
- Resource entry main is already defined.
- 操作符对应的类
- Ubuntu 11.10 GCC4.5 GCC4.6无缝切换
- BAPI_GOODSMVT_CREATE的几个应用
- android模拟器连接本机tomcat http://192.168.5.102
- 没有PARAMETER ID,想 call TRANSACTION
- 人生不过一个字【Life is but a word】