Java代码实现依赖注入
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://zhangjunhd.blog.51cto.com/113473/126545
| |||||||||||||
v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}
st1/:*{behavior:url(#ieooui) }
这里将模仿
Spring
实现一种基于
xml
配置文件的
依赖注入
机制。文件中将实现
3
中注入,一是单值注入,包括
int,float
,
double
,
char
等,也包括
String
注入;二是
Java
容器注入,包括
List
,
Set
,
Map
三种容器的注入,最后一种是
java bean
对象注入。
实现的机制是,使用
Dom4j
对
xml
配置文件进行解析,这里使用
dom4j
的
Element Handler
机制,一种类似与责任链模式的实现机制;对于
java
对象的构建使用反射机制,这里主要是针对得到的类的
Field
进行
set
赋值。我试图通过调用
Method
的
invoke
方法调用类本身的
setter
方法,但是由于通过
xml
解析得到的值都是
String
,如果将这些
String
动态的转换为相应的确定类型是个难点,
Method
的
invoke
方法,如果形参是
int
,而传入
java.lang.Integer
,它不会认,所以尝试失败,只能通过
Field
的
set
方法传入特定值。
配置文件
setting.xml
依据
setting.xml
,这里将构建两个
Person
类的实例
me
和
you
:
Person.java
紧接着,构建一个
ListOne
的实例
myList
:
ListOne.java
紧接着,构建一个
SetOne
的实例
mySet
:
SetOne.java
紧接着,构建一个
MapOne
的实例
myMap
:
MapOne.java
最后构建一个
Persons
类的实例
us
,其中包含
me
和
you
两个已经构建好的对象:
Persons.java
主要的实现机制是(代码BeanFactory.java以及工程见附件),
1.
通过一个
HashMap
保存构造好的对象,
key
就是
bean
的
id
属性,
value
就是这个对象;
查询时
2.init
方法读入配置文件
setting.xml
,并直接定位到
beans
下的
bean
元素,并实例化一个
ElementHandler
对其处理。
3.ElementHandler
,
dom4j
的
ElementHandler
接口有两个方法,一个是
onStart()
,它主要用于处理该元素的属性以及动态增加新的
Handler
类;另一个是
onEnd()
,它主要用于获得该元素的
Text
文本以及删除已添加的
Handler
。
BeanHandler
PropertyHandler
根据
setting.xml
,我们可以得到各种注入元素的
Handler
类处理流程图。
![]()
4.
setFieldValue()
基于反射机制和相应的类信息得到
Field
的类型,并根据
setting.xml
设置它的值。
5.
测试
测试结果:
ZJ 26 1.78
Mary 27 1.66
[java, c, windows]
[cat, tom, dog]
{c=CHINA, j=JAPAN, k=KOREA}
com.zj.ioc.di.imp.Person@1a5ab41
com.zj.ioc.di.imp.Person@18e3e60
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/126545 本文出自 51CTO.COM技术博客 |