首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

利用Commons-BeanUtils兑现简易的依赖注入框架

2012-11-01 
利用Commons-BeanUtils实现简易的依赖注入框架最近在完成一个小小的framework项目,由于项目中不使用spring

利用Commons-BeanUtils实现简易的依赖注入框架

最近在完成一个小小的framework项目,由于项目中不使用spring,juice,自己实现了一个简易的依赖注入框架。


? 1. 写一个xml文件作为配置的实际例子

?

?

?

?

?

?2. 根据这个xml文件,定义一个schema文件,验证配置文件

?

?

?

?

·???????? 创建xsdConfig文件,内容主要是生成的java类的package名,类simple name的前缀和后缀

?

?

?

?

?

·???????? 创建一个bat可执行文件,不用每次跑都去cmd下敲一堆命令,累啊。bat文件的内容:

scomp -d classes\beanIoc -src src\beanIoc -out beanIoc.jar beanIoc.xsd beanIoc.xsdconfig

?

·???????? 双击bat,所需要的java类的.java文件,class文件和xmlbeans jaxb需要的元数据都横空出世了,这些元数据xmlbeans会用来对xml文件进行验证,检查是否符合schema定义的语义规则。

·???????? 把java文件和元数据信息都拷贝到eclipse中吧,或者直接把生成的jar包发布到maven repository中,然后再pom中dependency它。

?

?

?

4. 解析的过程中,需要生成被依赖注入的对象,并完成属性的动态设定。

4.1? ?生成依赖注入的对象

生成依赖注入的对象是通过反射直接生成类的实例,在这里要求有public的参数为空的构造函数。

??

?

?

?

4.2? 属性的动态设定

Commons-BeanUtils就是专门免费做这件事的好同志,我们可以利用它来完成,基本类型和一些经常使用的类型,Commons-BeanUtils责无旁贷的提供了自动转换的功能,beanutils不需要我们提供参数的类型,它可以自动完成转换,它是根据get和set方法的类型来决定类型的,可参见PropertyDescriptor.getPropertyType()方法。使用方法如下:

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

isWriteable方法判断是否有可用的set方法,如果有就完成属性的动态设置。paramBean就是xml文件中定义的那个param。

?

?

但是Beanutils默认帮我们转换的类型为基本类型和所有它已经提供了Converter的class类型,如果我们有特殊的类需要进行动态设定,必须自己提供converter,注册到它的converters map中。这样beanutils兄弟在动态设定属性值的时候,就会根据属性的类型去converter map中把取出该属性类型对应的自定义converter来转换。因为在这里配置文件中配置的都是String, 所以我们对Converter接口做了修改:

?

?

?

?

?

我们强制规定了convert方法的参数必须是String,自己提供的converter必须继承BeanConverter抽象类。

?

4.3 属性逻辑规则的检查

在设置好属性以后,这个属性的值并不一定配置的正确,也不一定满足逻辑规则,比如希望int值在3到5之间,比如希望String 不要为空等等。为了在动态设定完属性后进行逻辑规则的校验,提供了InitializingBean接口

?

实现该接口的类,它们的逻辑规则需要在afterProperties提供,不符合规则的请抛异常,并会在属性设定完后检查。

?

?

?

?

?

?

?

?

4.4? 将bean注册到BeanContext中

?

?

4.5清理环境

完成属性的动态注入后,还需要清理环境

?

?

?

5.如何做到基于接口设计

·???????? Converter提供了基于接口设计的功能:我们可以动态的设置不同的实现。

·???????? 用了该框架,本身就基于接口,我们可以在配置文件中修改bean的实现类。应用程序代码它不关心具体的实现类,它只关心id。

?

不过,这里没有象spring和juice那么强大的bean factory功能。因为这个东东只是一个小项目的一小部分,所以功能上满足小项目的需求就足够了。

?

6. Test

?就简单的测了一下,可以看源代码。

?

7.总结

主要是项目是基于接口设计的,所以一些类的实现需要在配置文件里设定,实现类的实例属性也要是可以扩展的,并且提供属性值的逻辑校验,所以就有了这么一个东东。

?

?

源代码:

2 楼 ldd600 2008-09-27   commons-beanutils就用了java.reflect,您应该说的是dynamic proxy吧,用dynamic proxy和cglib虽然有很强的灵活性,但是也增加了复杂性。其实我本身项目中使用commons-beanutils已经足够了,只是为了指定一个实现类,没有必要用到它们,个人认为。您说的动态的可配置是指,不重新restart server的情况下动态load?

热点排行