作为微软阵营的coder,最近开始接触java,刚开始,各种不适应、心里各种骂,IDE不好用啊、基础jar包的功能不好用啊之类的,当然了相比.Net平台来说,这是事实,慢慢的发现java阵营其实挺不错,感觉java阵营非常的“自由”,很多的东西都是免费的,不仅免费,源码都有;
废话不扯,进入正题,要学什么东西最好从理解它的思想开始,spring也是这样,spring的核心思想大家都知道:IOC(依赖注入或者叫控制反转)、AOP(面向切面)。
什么是依赖注入呢,为什么叫依赖注入呢,看下面代码:
public class A { public methodX() { System.out.println("我是业务逻辑!"); } }
public class classB { public void methodB() { classA objA=new classA(); objA.methodX(); } }
从上面的代码来看,classB需要调用classA的方法,这就是说classB依赖classA,classA就是classB的依赖;那么这是常规的写法,这么写最直接,初学者都喜欢,但是这么写,classB和classA的耦合度高,比如说现在还有一个类classC,代码如下:
public class classC { public void methodX() { System.out.println("我是业务逻辑的扩展!"); } }
如果现在需要用classC换掉classA,就得动classB的代码(通篇改代码,会被leader骂死,除非leader自己也这样写),那么怎么写合理呢(话说架构师大半辈子都在研究如何解耦),这么写:
public interface interfaceX { void methodX(); }
先定义个接口,如上;
public class classA implements interfaceX { public void methodX() { System.out.println("我是业务逻辑!"); } }
实现该接口;
public class classC implements interfaceX { public void methodX() { System.out.println("我是业务逻辑的扩展!"); } }
下面是关键:
public class myFactory { public static interfaceX getObj() { String className="classA";//此处从配置文件中读取需要创建的类名称,,懒得写了,略 interfaceX obj=null; try { switch(className) { case "classA": { obj = (classA)myFactory.class.forName(className).newInstance(); } case "classC": { obj = (classC)myFactory.class.forName(className).newInstance(); } //...........需要改变时在此处添加个分支就OK了 default : obj = new classA(); } } catch(Exception ex) { } return obj; } }
定义个生成对象实例的工厂,如上;
public class classB { public void methodB() { interfaceX obj=myFactory.getObj(); obj.methodX(); } }
这样耦合就降低了,就不用动classB的代码了;这样,classB的依赖(classA)就不是写死的了,就是通过反射“注入”进来的,如果需要,可以很轻松的换掉(通过修改配置文件),当然了,接口(interfaceX)不能变;
原文:http://www.cnblogs.com/wuchuang/p/5228736.html