前言
大家好,我是老王,今天继续和大家分享反射技术。
上次我们使用反射封装了对数据库的查询,现在我们继续研究反射的用途——探究Spring的IoC容器。
首先,我们得了解什么是IoC?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
如果我这么和你讲概念。你可能会很郁闷,因为这很难理解,或者我根本看不懂!
简单来讲,IoC可以帮我们创建对象,而无需你来new它(但不仅仅是这么简单)。
Case2:
首先来看一个创建“车”的工厂:
public interface Car { public void run(); } public class Benz implements Car { @Override public void run() { System.out.println("奔驰在路上疾驰..."); } } public class BMW implements Car { @Override public void run() { System.out.println("宝马在路上疾驰..."); } } public class CarFactory { public static Car getInstance(String cartype) { Car car = null; if ("benz".equals(cartype)) { car = new Benz(); } if ("bmw".equals(cartype)) { car = new BMW(); } return car; } }
这段代码,缺点很明显。如果我想创建“Audi”车,就需要修改工厂的getInstance方法,接下来我们使用反射对其改进:
public class CarFactory { public static Car getInstance(String className) { Car car = null; try { car = (Car) Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return car; } }
使用反射机制实现的工厂可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。在src下新建一个名为car.properties的文件,内容如下:
benz=cn.gzsxt.model.Benz bmw=cn.gzsxt.model.BMW audi=cn.gzsxt.model.Audi
其实,在Spring中经常使用的是xml文件的配置形式,这里仅做功能展示。
接下来,使用java.util.Properties读取该配置
public class CarFactory { private static Properties pro = new Properties(); static { //加载配置文件信息,将配置信息读取到Properties的对象中 try { InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties"); pro.load(in); } catch (IOException e) { e.printStackTrace(); } } public static Car getInstance(String className) { Car car = null; try { car = (Car) Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return car; } }
接下来,我们使用Properties对象获取“类名”
public static void main(String[] args) { String className = CarFactory.pro.getProperty("benz"); Car car = CarFactory.getInstance(className); System.out.println(car); }
显示结果为:[email protected]
很明显,我们希望生产“Benz”车,而打印结果也是Benz类的对象!
之后我们无需对代码进行改动,只需要修改配置文件即可!
好了,今天的分享就告一段落了,下期再见~!Bye!
原文地址:https://www.cnblogs.com/laownag/p/10840996.html