`

IOC模式

阅读更多
   IOC(inversion of control)意为控制反转。具体而言就是把原本由程序本身控制的类之间的依赖关系反转给ioc容器来维护。它是通过依赖注入来实现的。这样做的好处是显而易见的,类之间的关系由容器维护之后就会变得很灵活,耦合性就会大大降低,而且易于维护,因为关系是可以轻而易举的随时改变的。容器把一个类的实例注入到另一个需要使用这个实例的类中,从而实现了类之间的依赖,这就是依赖注入。spring框架就是这一思想的很好体现。

下面以一个简单的例子说明:

1.建立一个接口:
public interface Person {
          public void sayHello();
}

2.建立两个类实现这个接口:
public class Student implements Person {
          public void sayHello() {
                    System.out.println("Student say hello!");
         }
}

public class Teacher implements Person {
         public void sayHello() {
                   System.out.println("Teacher say hello!");
         }
}

在这两个类中我们实现了相同的方法;
3.在容器中配置信息,也可以说在spring框架的applicationContext.xml配置文件中写入以下信息,主要的是类的依赖注入:
<bean id="student" class="com.dc.test.Student">
</bean>

<bean id="teacher" class="com.dc.test.Teacher">
</bean>

<bean id="testDAO" class="com.dc.test.Test">
   <property name="dao" ref="student"></property>
</bean>

4.测试类:
public class Test {
private Person dao;

public Person getDao() {
         return dao;
}

public void setDao(Person dao) {
          this.dao = dao;
}
//调用接口方法
public void testPerson() {
           dao.sayHello();
}

public static void main(String[] args) {
   //获取bean工厂
   BeanFactory beanfactory = new XmlBeanFactory(new FileSystemResource(
   "src/applicationContext.xml"));
   //获取在配置文件中跟testDAO对应的类的实例
   Test test=(Test)beanfactory.getBean("testDAO");
   test.testPerson();
}
}

    在配置文件中,也可以说容器中,我们看到bean标签,它用来配置程序中的类:id为类的标识,class为某个包中的类,property为类中属性。在这里我们看到id为testDAO对应的类为测试类Test,其中property的name对应Test类的属性dao,而且使用ref引用了id为student的类。这样配置完成后,当我们在Test类中调用dao的sayHello方法时容器就会把student的实例注入到dao中,相当于调用了student的sayHello方法,而这个实例并不是我们new出来的。当然也可以把student换成teacher,因为它们都是Person的实现类,可以随时切换。

        在这以过程中体现出了很多东西。其中容器中的注入功能体现反射机制,并且反射出来的实例是单例的----也可以设置为多例;因为注入的东西是可以随时切换的,所以会变得很灵活,尤其在大量使用类实例的时候;可扩展性变好,可以有多个实现;维护性变强,如果一个实现出现问题,可以立即切换到另一个实现;因为可以随时切换实现,耦合度也降低了。

       这就是简单的IOC模式应用,当然在实际中应用要复杂的多,这里只是作了一个说明。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics