spring本质上是一个大工厂,根据xml文件能创建出程序所需的对象,有效的降低程序的耦合性。那为什么这样能降低程序的耦合性呢?我们最初想要创建对象,都是调用类的构造函数,new出我们需要的对象。但是这样做不好,一旦我们要实例化的对象发生改变,就需要把每一处创建实例的代码都修改,提高了代码维护的难度。于是工厂模式出现了,所需的对象都由一个工厂类产生,需要改变时,只需修改对应的工厂方法就行了。但是这样依然不够好,人们想能不能有一个配置文件,里面定义了我对所需对象的要求,工厂类对我的配置文件进行解析,来产生我所需的类,一旦我的需求发生改变,我只需要修改对应的配置文件就行了,不再需要去修改我的源码。这样不仅把程序的耦合性降低了,还把维护的难度也降低了。spring IOC容器就是做的这样一件事情。下面我来简单模拟一下IOC容器产生对象实例的过程(没有实现依赖注入)
dog基类与两个实现类
public class Dog {
private Dog() {} public void move() { System.out.println("一只狗在跑"); } public void call() { System.out.println("一只狗在叫"); } }
public class Corgi extends Dog{ @Override public void move() { System.out.println("一只柯基在跑"); } @Override public void call() { System.out.println("一只柯基在叫"); } }
public class GoldenRetriever extends Dog{
@Override
public void move() {
System.out.println("一只金毛在跑");
}
@Override
public void call() {
System.out.println("一只金毛在叫");
}
}
配置文件beans.properties
dog = beanFactory.GoldenRetriever
工具类PropertiesUtil:负责加载和解析配置文件
public class PropertiesUtil { private static Properties props; static { InputStream inputStream = null; try { props = new Properties(); inputStream = PropertiesUtil.class.getResourceAsStream("beans.properties"); props.load(inputStream); } catch (IOException e) { new RuntimeException(e); System.out.println("找不到对应的配置文件"); }finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static String getProperty(String id) { return props.getProperty(id); } }
测试:
@Test public void testBeanFactory() throws Exception { Dog dog = BeanFactory.getBean("dog"); dog.move(); dog.call(); }
结果:
一只金毛在跑
一只金毛在叫
当我们需要的dog对象需要改变时,我们只需要把配置文件改为:
dog = beanFactory.Corgi
结果:
一只柯基在跑
一只柯基在叫