利用Java的反射与代理机制实现IOC
2009-12-03 14:38
796 查看
在
Java中,其反射和动态代理机制极其强大,我们可以通过其反射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真实对象中的某个对象。而
Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理方法。
Java的反射和动态代理机制,使
Java变得更加强大。
Spring框架这几年风头正劲,虽然使用者众多,但真正了解其内部实现原理的朋友却并不是很多。其实,了解它的内部实现机制和设计思想是很有必要的大家都知道,
Spring框架的
IOC和
AOP部分功能强大,很值得我们学习。那么让我们在这两篇文章中分别详细的学习
IOC和
AOP的实现吧。
在本文中,主要讲述的是用
Java的反射机制实现
IOC。下面,让我们开始
IOC之旅吧!
一.
Java
反射机制概述与初探
Java的反射机制是
Java语言的一个重要特性,
Java具有的比较突出的动态机制就是反射(
reflection)。通过它,我们可以获取如下信息:
1) 在运行时判断任意一个对象所属的类;
2) 在运行时获取类的对象;
3) 在运行时获得类所具有的成员变量和方法等。
下面让我们通过调用一个
Java Reflection API的演示实例来见识一下反射机制的强大。
首先在
IDE中建立名为
reflection_proxy的
Java工程,并建立存放源文件的目录
src,并在
src目录下分别建立
org.amigo. reflection目录和
org.amigo.proxy目录来分别存放代理和反射的实例。我们在
reflection目录下建立
ReflectionTest.java文件,在该文件中编写代码来演示
Java Reflection API的使用。该类的代码如下所示:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.awt.Button;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.lang.reflect.Method;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Hashtable;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*初探Java的反射机制.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:13:48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass ReflectionTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramargs
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicstaticvoid main(String[] args)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ReflectionTest reflection
=
new
ReflectionTest();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
reflection.getNameTest();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
""
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
reflection.getMethodTest();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Class的getName()方法测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@throwsException
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid getNameTest()
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========begin getNameTest============
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String name
=
"
阿蜜果
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class cls
=
name.getClass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
String类名:
"
+
cls.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Button btn
=
new
Button();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class btnClass
=
btn.getClass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
Button类名:
"
+
btnClass.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class superBtnClass
=
btnClass.getSuperclass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
Button的父类名:
"
+
superBtnClass.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class clsTest
=
Class.forName(
"
java.awt.Button
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
clsTest name:
"
+
clsTest.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========end getNameTest============
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Class的getMethod()方法测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@throwsException
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid getMethodTest()
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========begin getMethodTest==========
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class cls
=
Class.forName(
"
org.amigo.reflection.ReflectionTest
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class ptypes[]
=
new
Class[
2
];
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ptypes[
0
]
=
Class.forName(
"
java.lang.String
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ptypes[
1
]
=
Class.forName(
"
java.util.Hashtable
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Method method
=
cls.getMethod(
"
testMethod
"
, ptypes);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object args[]
=
new
Object[
2
];
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
args[
0
]
=
"
hello, my dear!
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Hashtable
<
String, String
>
ht
=
new
Hashtable
<
String, String
>
();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ht.put(
"
name
"
,
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
args[
1
]
=
ht;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String returnStr
=
(String) method.invoke(
new
ReflectionTest(), args);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
returnStr=
"
+
returnStr);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========end getMethodTest==========
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String testMethod(String str, Hashtable ht)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String returnStr
=
"
返回值
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
测试testMethod()方法调用
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
str=
"
+
str);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
名字=
"
+
(String) ht.get(
"
name
"
));
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
结束testMethod()方法调用
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
returnStr;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
运行该例,可在控制台看到如下内容:
===========begin getNameTest============
String
类名
: java.lang.String
Button
类名
: java.awt.Button
Button
的父类名
: java.awt.Component
clsTest name: java.awt.Button
===========end getNameTest============
===========begin getMethodTest==========
测试
testMethod()
方法调用
str= hello, my dear!
名字
=
阿蜜果
结束
testMethod()
方法调用
returnStr=
返回值
===========end getMethodTest==========
分析运行结果,我们可以发现,
Java
的反射机制使得我们在运行时能够判断一个对象所属的类,获取对象的方法并得其进行调用,并获取方法的返回结果等功能。
二.
IOC
使用的背景
在我们日常的设计中,类与类之间存在着千丝万缕的关系,如果两个类存在着强耦合关系,那么在维护时,一个类的修改很可能会牵动另一个类的关联修改,从而使得我们的维护工作步履维艰。下面让我们来看这样的一个强耦合反面例子。
首先我们建立一个
Chinese.java类,该类的
sayHelloWorld(String name)方法,用中文对名为
name的人问好,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*中国人类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:37:17
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass Chinese
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*用中文对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramname姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid sayHelloWorld(String name)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String helloWorld
=
"
你好,
"
+
name;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(helloWorld);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
下面我们接着建立一个
American.java
类,
该类的
sayHelloWorld(String name)方法,用英文对名为
name的人问好,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*美国人类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@version1.0
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:41:27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass American
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*用英文对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramname姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid sayHelloWorld(String name)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String helloWorld
=
"
Hello,
"
+
name;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(helloWorld);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
最后我们编写一个测试类对这两个类的
sayHelloWorld(String name)
方法进行测试,下面是该类的内容:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*HelloWorld测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:45:13
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass HelloWorldTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*测试Chinese和American的sayHelloWorld()方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramargs
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:43:51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicstaticvoid main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Chinese chinese
=
new
Chinese();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
chinese.sayHelloWorld(
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
American american
=
new
American();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
american.sayHelloWorld(
"
Amigo
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
观察
HelloWorldTest
我们可以很清楚的看到,该类与
Chinese.java
类和
American.java
类都存在强耦合关系。
上面的例子让我们想到的是在
N
年以前,当我们需要某个东西时,我们一般是自己制造。但是当发展到了一定的阶段后,工厂出现了,我们可以工厂中购买我们需要的东西,这极大的方便了我们。在上例中,我们都是通过
new
来创建新的对象,在开发中,这种强耦合关系是我们所不提倡的,那么我们应该如何来实现这个例子的解耦呢?我们接着想到了使用工厂模式,我们需要新建一个工厂类来完成对象的创建,并采用依赖接口的方式,此时需要对代码进行如下修改:
首先建立接口类
Human.java
,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 人类接口类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午11:04:56
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
interface
Human
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
name 姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public
void
sayHelloWorld(String name);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
并将
American.java类和
Chinese.java类改为实现该接口,即类头分别改成:
public class American implements Human和
public class Chinese implements Human。
接着编写
HumanFactory.java工厂类,其内容为
:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 工厂类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午11:09:30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
HumanFactory
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 通过类型字段获取人的相应实例
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
type 类型
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@return
返回相应实例
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
Human getHuman(String type)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(
"
chinese
"
.equals(type))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
new
Chinese();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
else
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
new
American();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
最后我们还需要修改测试类
HelloWorld.java类,修改后的内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* HelloWorld测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午10:45:13
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
HelloWorldTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 测试sayHelloWorld()方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
args
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午10:43:51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
static
void
main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
HumanFactory factory
=
new
HumanFactory();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Human human1
=
factory.getHuman(
"
chinese
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
human1.sayHelloWorld(
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Human human2
=
factory.getHuman(
"
american
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
human2.sayHelloWorld(
"
Amigo
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
观察此例我们可以看到,该类不再与具体的实现类
Chinese和
American存在耦合关系,而只是与它们的接口类
Human存在耦合关系,具体对象的获取只是通过传入字符串来获取,很大程度上降低了类与类之间的耦合性。
但是我们还是不太满足,因为还需要通过
chinese和
american在类中获取实例,那么当我们需要修改时实现时,我们还需要在类中修改这些字符串,那么还有没有更好的办法呢?让我们在下节中进行继续探讨。
三.
IOC
粉墨登场
IOC(
Inverse of Control
)可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”。在
Spring中,通过
IOC可以将实现类、参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合。我们还可以对某对象所需要的其它对象进行注入,这种注入都是在配置文件中做的,
Spring的
IOC的实现原理利用的就是
Java的反射机制,
Spring还充当了工厂的角色,我们不需要自己建立工厂类。
Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过
bean的名称获取对应的对象。
下面让我们看看如下的模拟
Spring的
bean工厂类:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.io.InputStream;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.lang.reflect.Method;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.HashMap;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Iterator;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Map;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Attribute;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Document;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Element;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.io.SAXReader;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* bean工厂类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午10:04:41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
BeanFactory
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
Map
<
String, Object
>
beanMap
=
new
HashMap
<
String, Object
>
();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* bean工厂的初始化.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
xml xml配置文件
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
init(String xml)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
读取指定的配置文件
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SAXReader reader
=
new
SAXReader();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ClassLoader classLoader
=
Thread.currentThread().getContextClassLoader();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
从class目录下获取指定的xml文件
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
InputStream ins
=
classLoader.getResourceAsStream(xml);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Document doc
=
reader.read(ins);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element root
=
doc.getRootElement();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element foo;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
遍历bean
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator i
=
root.elementIterator(
"
bean
"
); i.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
foo
=
(Element) i.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取bean的属性id和class
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute id
=
foo.attribute(
"
id
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute cls
=
foo.attribute(
"
class
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
利用Java反射机制,通过class的名称获取Class对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class bean
=
Class.forName(cls.getText());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取对应class的信息
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
java.beans.BeanInfo info
=
java.beans.Introspector.getBeanInfo(bean);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取其属性描述
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
java.beans.PropertyDescriptor pd[]
=
info.getPropertyDescriptors();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
设置值的方法
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Method mSet
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
创建一个对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object obj
=
bean.newInstance();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
遍历该bean的property属性
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator ite
=
foo.elementIterator(
"
property
"
); ite.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element foo2
=
(Element) ite.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取该property的name属性
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute name
=
foo2.attribute(
"
name
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String value
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取该property的子元素value的值
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator ite1
=
foo2.elementIterator(
"
value
"
); ite1.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element node
=
(Element) ite1.next(); value
=
node.getText();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
break
;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(
int
k
=
0
; k
<
pd.length; k
++
)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(pd[k].getName().equalsIgnoreCase(name.getText()))
![](http://www.blogjava.net/Images/dot.gif)
{ mSet
=
pd[k].getWriteMethod();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
利用Java的反射极致调用对象的某个set方法,并将值设置进去 mSet.invoke(obj, value);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
将对象放入beanMap中,其中key为id值,value为对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
beanMap.put(id.getText(), obj);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
catch
(Exception e)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(e.toString());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 通过bean的id获取bean的对象.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
beanName bean的id
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@return
返回对应对象
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
Object getBean(String beanName)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object obj
=
beanMap.get(beanName);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
obj;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 测试方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
args
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午11:21:14
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
static
void
main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BeanFactory factory
=
new
BeanFactory();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
factory.init(
"
config.xml
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
JavaBean javaBean
=
(JavaBean) factory.getBean(
"
javaBean
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
userName=
"
+
javaBean.getUserName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
password=
"
+
javaBean.getPassword());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
该类的
init(xml)方法,通过指定的
xml来给对象注入属性,为了对该类进行测试,我还需要新建一个
JavaBean和在
src目录下新建一个名为
config.xml的配置文件。
JavaBean的内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 简单的bean,用于测试
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午11:24:30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
JavaBean
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
String userName;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
String password;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String getPassword()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
password;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String getUserName()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
userName;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
setUserName(String userName)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this
.userName
=
userName;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
setPassword(String password)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this
.password
=
password;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
这个简单
bean对象中有两个属性,分别为
userName和
password,下面我们在配置文件
config.xml中对其属性注入对应的属性值。配置文件内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
beans
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
bean
id
="javaBean"
class
="org.amigo.reflection.JavaBean"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
property
name
="userName"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
value
>
阿蜜果
</
value
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
property
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
property
name
="password"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
value
>
12345678
</
value
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
property
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
bean
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
beans
>
类与配置文件都完成后,可以运行
BeanFactory.java文件,控制台显示内容为:
userName=
阿蜜果
password=12345678
可以看到,虽然在
main()方法中没有对属性赋值,但属性值已经被注入,在
BeanFactory类中的
Class bean = Class.forName(cls.getText());通过类名来获取对应的类,
mSet.invoke(obj, value);通过
invoke方法来调用特定对象的特定方法,实现的原理都是基于
Java的反射机制,在此我们有一次见证了
Java反射机制的强大。
当然,这只是对
IOC的一个简单演示,在
Spring中,情况要复杂得多,例如,可以一个
bean引用另一个
bean,还可以有多个配置文件、通过多种方式载入配置文件等等。不过原理还是采用
Java的反射机制来实现
IOC的。
四.
总结
在本文中,笔者通过讲述
Java反射机制概述与初探、
IOC使用的背景、
IOC粉墨登场等内容,演示了
Java反射机制
API的强大功能,并通过编写自己的简单的
IOC框架,让读者更好的理解了
IOC的实现原理。
本文通过
IOC的一个简要实现实例,模拟了
Spring中
IOC的实现,虽然只是完成了
Spring中依赖注入的一小部分工作,但是很好的展现了
Java反射机制在
Spring中的应用,能使我们能更好的从原理上了解
IOC的实现,也能为我们实现自己的准
Spring框架提供方案,有兴趣的朋友可以通过
Spring的源码进行
IOC的进一步的学习。
Java中,其反射和动态代理机制极其强大,我们可以通过其反射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真实对象中的某个对象。而
Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理方法。
Java的反射和动态代理机制,使
Java变得更加强大。
Spring框架这几年风头正劲,虽然使用者众多,但真正了解其内部实现原理的朋友却并不是很多。其实,了解它的内部实现机制和设计思想是很有必要的大家都知道,
Spring框架的
IOC和
AOP部分功能强大,很值得我们学习。那么让我们在这两篇文章中分别详细的学习
IOC和
AOP的实现吧。
在本文中,主要讲述的是用
Java的反射机制实现
IOC。下面,让我们开始
IOC之旅吧!
一.
Java
反射机制概述与初探
Java的反射机制是
Java语言的一个重要特性,
Java具有的比较突出的动态机制就是反射(
reflection)。通过它,我们可以获取如下信息:
1) 在运行时判断任意一个对象所属的类;
2) 在运行时获取类的对象;
3) 在运行时获得类所具有的成员变量和方法等。
下面让我们通过调用一个
Java Reflection API的演示实例来见识一下反射机制的强大。
首先在
IDE中建立名为
reflection_proxy的
Java工程,并建立存放源文件的目录
src,并在
src目录下分别建立
org.amigo. reflection目录和
org.amigo.proxy目录来分别存放代理和反射的实例。我们在
reflection目录下建立
ReflectionTest.java文件,在该文件中编写代码来演示
Java Reflection API的使用。该类的代码如下所示:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.awt.Button;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.lang.reflect.Method;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Hashtable;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*初探Java的反射机制.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:13:48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass ReflectionTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramargs
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicstaticvoid main(String[] args)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ReflectionTest reflection
=
new
ReflectionTest();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
reflection.getNameTest();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
""
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
reflection.getMethodTest();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Class的getName()方法测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@throwsException
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid getNameTest()
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========begin getNameTest============
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String name
=
"
阿蜜果
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class cls
=
name.getClass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
String类名:
"
+
cls.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Button btn
=
new
Button();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class btnClass
=
btn.getClass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
Button类名:
"
+
btnClass.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class superBtnClass
=
btnClass.getSuperclass();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
Button的父类名:
"
+
superBtnClass.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class clsTest
=
Class.forName(
"
java.awt.Button
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
clsTest name:
"
+
clsTest.getName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========end getNameTest============
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Class的getMethod()方法测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@throwsException
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid getMethodTest()
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========begin getMethodTest==========
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class cls
=
Class.forName(
"
org.amigo.reflection.ReflectionTest
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class ptypes[]
=
new
Class[
2
];
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ptypes[
0
]
=
Class.forName(
"
java.lang.String
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ptypes[
1
]
=
Class.forName(
"
java.util.Hashtable
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Method method
=
cls.getMethod(
"
testMethod
"
, ptypes);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object args[]
=
new
Object[
2
];
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
args[
0
]
=
"
hello, my dear!
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Hashtable
<
String, String
>
ht
=
new
Hashtable
<
String, String
>
();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ht.put(
"
name
"
,
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
args[
1
]
=
ht;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String returnStr
=
(String) method.invoke(
new
ReflectionTest(), args);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
returnStr=
"
+
returnStr);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
===========end getMethodTest==========
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String testMethod(String str, Hashtable ht)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String returnStr
=
"
返回值
"
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
测试testMethod()方法调用
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
str=
"
+
str);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
名字=
"
+
(String) ht.get(
"
name
"
));
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
结束testMethod()方法调用
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
returnStr;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
运行该例,可在控制台看到如下内容:
===========begin getNameTest============
String
类名
: java.lang.String
Button
类名
: java.awt.Button
Button
的父类名
: java.awt.Component
clsTest name: java.awt.Button
===========end getNameTest============
===========begin getMethodTest==========
测试
testMethod()
方法调用
str= hello, my dear!
名字
=
阿蜜果
结束
testMethod()
方法调用
returnStr=
返回值
===========end getMethodTest==========
分析运行结果,我们可以发现,
Java
的反射机制使得我们在运行时能够判断一个对象所属的类,获取对象的方法并得其进行调用,并获取方法的返回结果等功能。
二.
IOC
使用的背景
在我们日常的设计中,类与类之间存在着千丝万缕的关系,如果两个类存在着强耦合关系,那么在维护时,一个类的修改很可能会牵动另一个类的关联修改,从而使得我们的维护工作步履维艰。下面让我们来看这样的一个强耦合反面例子。
首先我们建立一个
Chinese.java类,该类的
sayHelloWorld(String name)方法,用中文对名为
name的人问好,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*中国人类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:37:17
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass Chinese
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*用中文对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramname姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid sayHelloWorld(String name)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String helloWorld
=
"
你好,
"
+
name;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(helloWorld);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
下面我们接着建立一个
American.java
类,
该类的
sayHelloWorld(String name)方法,用英文对名为
name的人问好,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*美国人类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@version1.0
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:41:27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass American
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*用英文对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramname姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicvoid sayHelloWorld(String name)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String helloWorld
=
"
Hello,
"
+
name;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(helloWorld);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
最后我们编写一个测试类对这两个类的
sayHelloWorld(String name)
方法进行测试,下面是该类的内容:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*HelloWorld测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:45:13
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
publicclass HelloWorldTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*测试Chinese和American的sayHelloWorld()方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*@paramargs
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*Creationdate:2007-10-2-上午10:43:51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
publicstaticvoid main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Chinese chinese
=
new
Chinese();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
chinese.sayHelloWorld(
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
American american
=
new
American();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
american.sayHelloWorld(
"
Amigo
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
观察
HelloWorldTest
我们可以很清楚的看到,该类与
Chinese.java
类和
American.java
类都存在强耦合关系。
上面的例子让我们想到的是在
N
年以前,当我们需要某个东西时,我们一般是自己制造。但是当发展到了一定的阶段后,工厂出现了,我们可以工厂中购买我们需要的东西,这极大的方便了我们。在上例中,我们都是通过
new
来创建新的对象,在开发中,这种强耦合关系是我们所不提倡的,那么我们应该如何来实现这个例子的解耦呢?我们接着想到了使用工厂模式,我们需要新建一个工厂类来完成对象的创建,并采用依赖接口的方式,此时需要对代码进行如下修改:
首先建立接口类
Human.java
,其内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 人类接口类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午11:04:56
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
interface
Human
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 对某人问好.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
name 姓名
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public
void
sayHelloWorld(String name);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
并将
American.java类和
Chinese.java类改为实现该接口,即类头分别改成:
public class American implements Human和
public class Chinese implements Human。
接着编写
HumanFactory.java工厂类,其内容为
:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 工厂类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午11:09:30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
HumanFactory
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 通过类型字段获取人的相应实例
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
type 类型
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@return
返回相应实例
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
Human getHuman(String type)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(
"
chinese
"
.equals(type))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
new
Chinese();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
else
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
new
American();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
最后我们还需要修改测试类
HelloWorld.java类,修改后的内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* HelloWorld测试.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午10:45:13
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
HelloWorldTest
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 测试sayHelloWorld()方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
args
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-2 - 上午10:43:51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
static
void
main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
HumanFactory factory
=
new
HumanFactory();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Human human1
=
factory.getHuman(
"
chinese
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
human1.sayHelloWorld(
"
阿蜜果
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Human human2
=
factory.getHuman(
"
american
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
human2.sayHelloWorld(
"
Amigo
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
观察此例我们可以看到,该类不再与具体的实现类
Chinese和
American存在耦合关系,而只是与它们的接口类
Human存在耦合关系,具体对象的获取只是通过传入字符串来获取,很大程度上降低了类与类之间的耦合性。
但是我们还是不太满足,因为还需要通过
chinese和
american在类中获取实例,那么当我们需要修改时实现时,我们还需要在类中修改这些字符串,那么还有没有更好的办法呢?让我们在下节中进行继续探讨。
三.
IOC
粉墨登场
IOC(
Inverse of Control
)可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”。在
Spring中,通过
IOC可以将实现类、参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合。我们还可以对某对象所需要的其它对象进行注入,这种注入都是在配置文件中做的,
Spring的
IOC的实现原理利用的就是
Java的反射机制,
Spring还充当了工厂的角色,我们不需要自己建立工厂类。
Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过
bean的名称获取对应的对象。
下面让我们看看如下的模拟
Spring的
bean工厂类:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.io.InputStream;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.lang.reflect.Method;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.HashMap;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Iterator;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
java.util.Map;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Attribute;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Document;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.Element;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import
org.dom4j.io.SAXReader;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* bean工厂类.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午10:04:41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
BeanFactory
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
Map
<
String, Object
>
beanMap
=
new
HashMap
<
String, Object
>
();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* bean工厂的初始化.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
xml xml配置文件
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
init(String xml)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
读取指定的配置文件
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SAXReader reader
=
new
SAXReader();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ClassLoader classLoader
=
Thread.currentThread().getContextClassLoader();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
从class目录下获取指定的xml文件
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
InputStream ins
=
classLoader.getResourceAsStream(xml);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Document doc
=
reader.read(ins);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element root
=
doc.getRootElement();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element foo;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
遍历bean
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator i
=
root.elementIterator(
"
bean
"
); i.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
foo
=
(Element) i.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取bean的属性id和class
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute id
=
foo.attribute(
"
id
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute cls
=
foo.attribute(
"
class
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
利用Java反射机制,通过class的名称获取Class对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Class bean
=
Class.forName(cls.getText());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取对应class的信息
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
java.beans.BeanInfo info
=
java.beans.Introspector.getBeanInfo(bean);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取其属性描述
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
java.beans.PropertyDescriptor pd[]
=
info.getPropertyDescriptors();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
设置值的方法
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Method mSet
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
创建一个对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object obj
=
bean.newInstance();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
遍历该bean的property属性
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator ite
=
foo.elementIterator(
"
property
"
); ite.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element foo2
=
(Element) ite.next();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取该property的name属性
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Attribute name
=
foo2.attribute(
"
name
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String value
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
获取该property的子元素value的值
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(Iterator ite1
=
foo2.elementIterator(
"
value
"
); ite1.hasNext();)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Element node
=
(Element) ite1.next(); value
=
node.getText();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
break
;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for
(
int
k
=
0
; k
<
pd.length; k
++
)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(pd[k].getName().equalsIgnoreCase(name.getText()))
![](http://www.blogjava.net/Images/dot.gif)
{ mSet
=
pd[k].getWriteMethod();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
利用Java的反射极致调用对象的某个set方法,并将值设置进去 mSet.invoke(obj, value);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
将对象放入beanMap中,其中key为id值,value为对象
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
beanMap.put(id.getText(), obj);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
catch
(Exception e)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(e.toString());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 通过bean的id获取bean的对象.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
beanName bean的id
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@return
返回对应对象
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
Object getBean(String beanName)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Object obj
=
beanMap.get(beanName);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
obj;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 测试方法.
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@param
args
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午11:21:14
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
static
void
main(String[] args)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BeanFactory factory
=
new
BeanFactory();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
factory.init(
"
config.xml
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
JavaBean javaBean
=
(JavaBean) factory.getBean(
"
javaBean
"
);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
userName=
"
+
javaBean.getUserName());
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.println(
"
password=
"
+
javaBean.getPassword());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
该类的
init(xml)方法,通过指定的
xml来给对象注入属性,为了对该类进行测试,我还需要新建一个
JavaBean和在
src目录下新建一个名为
config.xml的配置文件。
JavaBean的内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package
org.amigo.reflection;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
/** */
/**
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* 简单的bean,用于测试
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
*
@author
<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
* Creation date: 2007-10-6 - 上午11:24:30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
class
JavaBean
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
String userName;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private
String password;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String getPassword()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
password;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
String getUserName()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
userName;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
setUserName(String userName)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this
.userName
=
userName;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public
void
setPassword(String password)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this
.password
=
password;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
这个简单
bean对象中有两个属性,分别为
userName和
password,下面我们在配置文件
config.xml中对其属性注入对应的属性值。配置文件内容如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
beans
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
bean
id
="javaBean"
class
="org.amigo.reflection.JavaBean"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
property
name
="userName"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
value
>
阿蜜果
</
value
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
property
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
property
name
="password"
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
<
value
>
12345678
</
value
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
property
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
bean
>
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
</
beans
>
类与配置文件都完成后,可以运行
BeanFactory.java文件,控制台显示内容为:
userName=
阿蜜果
password=12345678
可以看到,虽然在
main()方法中没有对属性赋值,但属性值已经被注入,在
BeanFactory类中的
Class bean = Class.forName(cls.getText());通过类名来获取对应的类,
mSet.invoke(obj, value);通过
invoke方法来调用特定对象的特定方法,实现的原理都是基于
Java的反射机制,在此我们有一次见证了
Java反射机制的强大。
当然,这只是对
IOC的一个简单演示,在
Spring中,情况要复杂得多,例如,可以一个
bean引用另一个
bean,还可以有多个配置文件、通过多种方式载入配置文件等等。不过原理还是采用
Java的反射机制来实现
IOC的。
四.
总结
在本文中,笔者通过讲述
Java反射机制概述与初探、
IOC使用的背景、
IOC粉墨登场等内容,演示了
Java反射机制
API的强大功能,并通过编写自己的简单的
IOC框架,让读者更好的理解了
IOC的实现原理。
本文通过
IOC的一个简要实现实例,模拟了
Spring中
IOC的实现,虽然只是完成了
Spring中依赖注入的一小部分工作,但是很好的展现了
Java反射机制在
Spring中的应用,能使我们能更好的从原理上了解
IOC的实现,也能为我们实现自己的准
Spring框架提供方案,有兴趣的朋友可以通过
Spring的源码进行
IOC的进一步的学习。
相关文章推荐
- 利用Java的反射与代理机制实现IOC
- 利用Java的反射与代理机制实现IOC
- 利用Java的反射与代理机制实现AOP
- 利用Java的反射与代理实现IOC模式
- 利用Java的反射与代理机制实现AOP
- 利用Java的反射与代理实现IOC模式
- 利用Java的反射与代理机制实现AOP
- 利用Java的反射与代理机制实现AOP
- 利用Java的反射与代理实现IOC模式
- 利用java的反射实现IOC
- 利用Java的反射与代理实现AOP(推荐!!!)
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 利用Java的反射与代理实现AOP(转载)
- Java仿Spring框架IOC控制反转利用反射简单实现(源码)
- java 利用泛性和反射机制实现collections.sort排序模板
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象