IoC 反向控制 依赖注入
IoC反向控制依赖注入
IoC(反向控制依赖注入)这是Spring提出来了,这也是Spring一大特色。这里我不用多说,我们看Spring教程就可以了解。当然我们不用Spring也可以用IoC,下面我将介绍不用Spring的IoC。
IoC不是框架,她是java的技术,如今大多数轻量级的容器都会用到IoC技术。这里我就用一个例子来说明:
如:程序中有Mysql.calss、Oracle.class、SqlServer.class三个类,但我们不知道用户会选哪个数据库,所以我们不能把调用数据库的方法固定。当我们发布给用户时,我们也不可能去修改原代码,而只需去修改一个配置文件如database=mysql/oracle/sqlserver就可以了。也可以这么说,向调用数据库的方法传入一个参数如mysql就调用Mysql.calss类。这就可以理解为反向控制和依赖注入。到这里也许我们会想当传入一个类对应的参数就可以调用该类,那么我们传入一个方法对应的参数可以调用相对应的方法吗?答案是当然可以的。
也许程序员不爱看文字描述,下面的就用代码来辅助:
- 1、Implements(接口)或extends(继承类)
- 2、继承接口或继承类的类
- 3、用set方法和构造法注入类的IOC类
- 4、调用IoC的实现类
Mysql.class、Oracle.class、SqlServer.class继承DatebaseImp.class
DataBaseIoC.class用构造和set方法注入Mysql.class或Oracle.class或SqlServer.class
Test.class调用DataBaseIoC.class的方法。
一、定义接口:DataBaseImp
public interface DataBaseImp { public void getDate(); }
二、定义调用接口的类Mysql、Oracle、Sqlserver
public class Mysql implements DataBaseImp { public void getDate() { System.out.println("调用Mysql数据"); } } public class Oracle implements DataBaseImp { public void getDate() { System.out.println("调用Oracle数据"); } } public class SqlServer implements DataBaseImp { public void getDate() { System.out.println("调用SqlServer数据"); } }
三、定义注入类
public class DateBaseIoC { private DataBaseImp dataBase; public void getDate() { dataBase.getDate(); } //用set方法注入类 public void setDataBase(DataBaseImp dataBase) { this.dataBase = dataBase; } }
四、定义实现类
public class Test { public static void main(String[] args) { DateBaseIoC baseIoC = new DateBaseIoC(); baseIoC.setDataBase(new Mysql()); //调用set baseIoC.getDate(); } }
最后输出:调用Mysql数据
这里主要要说明一下IoC类DateBaseIoC.class,上面用的是set方法注入的,下面是构造方法
public class DateBaseIoC{ private DataBaseImp dataBase; //构造方法,在调用时构造 public DateBaseIoC(DataBaseImp dataBase) { this.dataBase=dataBase; } public void getDate() { dataBase.getDate(); } }
从上面看出,我们只要修改Test.class实现类就可以调用不同的类,如果把newMysql()这个Object参数从配置文件里查询调用,那么软件就可以配置了。这里就不多讲如何实现,同时如何调用方法就在这里不多说。
原文:http://ajava.org/article-8-1.html