Spring中IoC的基本概念(一)
- 什么是IoC 在实际应用的开发当中,需要尽量避免和降低对象之间的依赖关系,即降低耦合度。而Ioc就是解决了一般业务对象之间、业务对象与持久层之间存在的各种依赖关系。 在没有Ioc的实现中,对象都是由程序的内部代码来控制的。当一个对象需要依赖另一个对象时,用new来创建它的依赖对象去实现两个组件之间的联系,而这种s实现方式会造成组件之间的耦合。 控制反转(Inverion of Control,IoC)是指在应用程序中对象的创建、销毁等不再由程序本身的编码实现,而是由外部的Spring容器在程序运行时根据需要注入到程序中,也就是对象的生命周期不是由程序本身来决定,而是由容器来控制,所以称之为控制反转。这种控制权转移所带来的好处就是降低对象之间的依赖关系,即解耦。 2、下面代码实现IoC 不同的动物各自喜爱的食物不一样,狗吃bone猫吃鱼fish (1)创建EatAble EatAble接口中定义一个eat方法,实现该接口的对象将提供具体的方法实现。EatAble.java public interface EatAble{ void eat(); } (2)创建一个Animal类实现EatAble接口,提供eat方法实现
public class Animal { private String animalType; private String eatMode; public void setAnimalType(String animalType) { this.animalType = animalType; } public void setEatMode(String eatMode) { this.eatMode = eatMode; } @Override public void eat(){ String msg = animalType + " eat " + eatMode; System.out.println(msg); } }
(3)添加Spring的配置信息 建立Spring的配置文件bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="animal" class="ioc.Animal"> <property name="animalType"> <value>Dog</value> </property> <property name="eatMode"> <value>bone</value> </property> </bean> </beans>
该配置文件的作用是将ioc.Animal类实例化为对象,该对象可以通过id的值animal来获取,设置animalType的属性为Dog,设置其eatMode的属性值为bone。 (4)创建测试类Test Test.java
public class Test { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); EatAble animal = (EatAble)ctx.getBean("animal"); animal.eat(); } }
这段代码的作用:首先加载Spring容器,然后通过键值animal来获取Animal的JavaBean对象,并将属性赋值; 程序运行的结果是
Dog eat bone
然后再把配置文件改为
<property name="animalType"> <value>Cat</value> </property> <property name="eatMode"> <value>fish</value> </property>
程序运行结果为Cat eat fish 3、通过上面的例子可以看到 (1)除了测试代码之外,所有的程序代码中,并没有依赖Spring中的任何组件。 (2)Animal的animalType和eatAble属性都是由Spring通过读取配置文件动态设置。由于属性是程序运行期间需要时才注入,减少了Animal类对这些属性的依赖,降低了耦合性。 因为Animal累属性的值不少硬编码产生,是由Spring容器注入,不依赖自身和=而依赖外部容器,所以称之为控制反转(IoC); (3)在不改变Animal类的任何代码情况下,可以通过简单的修改配置文件来实现不同类型Animal的eat行为。