议论:在spring中自动引用dao的bean的设想
讨论:在spring中自动引用dao的bean的设想
Updated on 2011-1-30
在struts2里使用了自动查找类的技术。
那部分代码可以用来实现这个。当然,主要还是要看具体项目需求。
Spring mvc的annotation方式配置Controller也采用了类似技术。
其基本思路是 从 Resource中查找META-INF下包含的jar包和其它classpath信息。
对于直接文件系统路径下文件,直接遍历目录得到类名;
对于jar,则内存中解压,遍历指定路径,得到类名;
在得到类名后,用该类名在classloader中查找具体实现类。
——————————————————————————————————————————————————
最近,大略看了下rails,觉得那种约定方式的编程,确实方便很多。
想到spring的DAO模式,其实基本上都是类似模式。
一堆接口对应一堆dao的实现,配置基本上都是雷同的。
不知道有无可能使用使用这样的方式来自动引入dao:
DaoFactory检索dao interface所在的package,然后解析dao的名字出来,
根据dao的名字建立bean放到spring的bean factory里,同时设置一下session factory。
比如有一个UserDao在接口包里,那么daoName就是userDao,生成的Bean就是userDao。
使用的实现类则按名称模式拼出来%daoName%Hibernate,UserDaoHibernate,或者就是以包的
最后一个字符串作为后缀。
这样就可以放一个dao的interface和实现,进行自动配置了。
类似下面的配置代码。
剩下的问题是,我对spring还不了解,不知道如何解决依赖关系的检查问题。

大家给点意见吧。
很不错的想法.关键是约定.service也可以直接引入包
很不错的想法.关键是约定.service也可以直接引入包对啊对啊,这样就不用每次都要为了加一个dao或者service还要改配置了。
文件路径是可以遍历的。要不这部分类就不打包了,直接放到目录里?然后将目录作为classpath加入。

花了几天时间终于把东西做出来了。
项目发布给大家看看。
因为包含了依赖的jar包,比较大,就不在这里放附件了。
放到我自己的网站上。
http://dwangel.mudfans.cn/projects/dyndao.rar
用eclipse做的项目。
Updated on 2011-1-30
在struts2里使用了自动查找类的技术。
那部分代码可以用来实现这个。当然,主要还是要看具体项目需求。
Spring mvc的annotation方式配置Controller也采用了类似技术。
其基本思路是 从 Resource中查找META-INF下包含的jar包和其它classpath信息。
对于直接文件系统路径下文件,直接遍历目录得到类名;
对于jar,则内存中解压,遍历指定路径,得到类名;
在得到类名后,用该类名在classloader中查找具体实现类。
——————————————————————————————————————————————————
最近,大略看了下rails,觉得那种约定方式的编程,确实方便很多。
想到spring的DAO模式,其实基本上都是类似模式。
一堆接口对应一堆dao的实现,配置基本上都是雷同的。
不知道有无可能使用使用这样的方式来自动引入dao:
DaoFactory检索dao interface所在的package,然后解析dao的名字出来,
根据dao的名字建立bean放到spring的bean factory里,同时设置一下session factory。
比如有一个UserDao在接口包里,那么daoName就是userDao,生成的Bean就是userDao。
使用的实现类则按名称模式拼出来%daoName%Hibernate,UserDaoHibernate,或者就是以包的
最后一个字符串作为后缀。
这样就可以放一个dao的interface和实现,进行自动配置了。
类似下面的配置代码。
<bean id="daoFactory" class="cn.mudfans.dwangel.spring.DaoFactory"> <property name="sessionFactory" value="sessionFactory"/> <property name="daoInterfacePackage" value="cn.mudfans.dwangel.dao"/> <property name="excludes"> <props/> </property> <property name="daoImplementPackage" value="cn.mudfans.dwangel.dao.hibernate"/> <property name="daoImplementPattern" value="%daoName%Hibernate"/> </bean>
剩下的问题是,我对spring还不了解,不知道如何解决依赖关系的检查问题。
大家给点意见吧。
1 楼
ronghao
2007-01-12
2 楼
dwangel
2007-01-12
ronghao 写道
3 楼
dhxyu
2007-01-12
en
4 楼
magice
2007-01-12
关键是这一步不好做,
DaoFactory检索dao interface所在的package里面接口的名字
DaoFactory检索dao interface所在的package里面接口的名字
5 楼
dwangel
2007-01-12
magice 写道
关键是这一步不好做,
DaoFactory检索dao interface所在的package里面接口的名字
嗯,原来以为reflect可以做到,后来查了一下,结果不行。DaoFactory检索dao interface所在的package里面接口的名字
文件路径是可以遍历的。要不这部分类就不打包了,直接放到目录里?然后将目录作为classpath加入。
6 楼
yananay
2007-01-12
不是好的解决方案....
不过对于特定的项目还是可以的.
不过对于特定的项目还是可以的.
7 楼
stamen
2007-01-12
希望给出代码,好象不是很懂你的意思。
8 楼
dwangel
2007-01-19
花了几天时间终于把东西做出来了。
项目发布给大家看看。
因为包含了依赖的jar包,比较大,就不在这里放附件了。
放到我自己的网站上。
http://dwangel.mudfans.cn/projects/dyndao.rar
用eclipse做的项目。
9 楼
volfo
2007-06-27
日本人做的seasar2就含有这方法,
http://s2container.seasar.org/ja/DIContainer.html
只要按照约定,命名class&packge,就能省去写xml的时间。
http://s2container.seasar.org/ja/DIContainer.html
只要按照约定,命名class&packge,就能省去写xml的时间。
10 楼
dwangel
2007-06-27
我知道的,但是Seasar2跟spring是等价的东西。
一般不会用spring又用seasar。
一般不会用spring又用seasar。
11 楼
baallee
2007-07-03
既然已经约定了类名和接口,我们可以动态生成这些配置文件在classpath下,程序运行期间可以让spring动态加载。不过考虑到效率问题,在程序启动时做类似的事会比较好。