作为微软阵营的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