http://www.skyinn.org/wiki/Wiki.jsp?page=Java_blogentry_270704_1
在使用Spring之前,DAO的配置、初始化、获取、释放等都需要自己写,
将近11个类或接口,量比较大,关系复杂,尚未包括配置文件处理、ThreadLocal、Filter等等
原来的DAOFactory,这还将DAO的配置信息由别的模块处理了的
001?/*?=============================================
002??*?$Id:?DAOFactory.java,v?1.4?2003/10/20?14:18:44?l_walker?Exp?$
003??*?Created?on?[2003-10-8?22:48:12]?by?l_walker
004??*?=============================================
005??*?The?Skyinn?Software?License?v1.0
006??*?===============================================
007??*/
008?package?org.skyinn.quasar.dao;
009?
010?import?org.apache.commons.collections.FastHashMap;
011?import?org.apache.commons.logging.Log;
012?import?org.apache.commons.logging.LogFactory;
013?import?org.skyinn.quasar.config.ApplicationConfiguration;
014?import?org.skyinn.quasar.util.StringUtil;
015?
016?
017?/**
018??*?DAO工厂类。
019??*
020??*?@author?$Author:?l_walker?$
021??*?@version?$Revision:?1.4?$?$Date:?2003/10/20?14:18:44?$
022??*/
023?public?class?DAOFactory?{
024?????//~?Static?fields/initializers?=============================================
025?
026?????/**DAOFactory?singleton?instance.*/
027?????private?static?DAOFactory?instance?=?new?DAOFactory();
028?
029?????//~?Instance?fields?========================================================
030?
031?????/**?Logging?*/
032?????private?Log?log?=?LogFactory.getLog?(this.getClass?());
033?
034?????/**DAO?pool.*/
035?????protected?FastHashMap?daos?=?new?FastHashMap();
036?
037?????/**DAO?configuration.*/
038?????protected?DAOConfig?daoConfig?=?null;
039?
040?????//~?Constructors?===========================================================
041?
042?????/**
043??????*?Default?Construtor.
044??????*/
045?????private?DAOFactory?()?{
046?????????super();
047?????????daoConfig?=?ApplicationConfiguration.getInstance().getDAOConfiguration();
048?????}
049?
050?????//~?Methods?================================================================
051?
052?????/**
053??????*?取DAO工厂,Singleton模式以确保系统中只有一个DAOFactory实例。
054??????*
055??????*?@return?DAO工厂实例
056??????*/
057?????public?static?synchronized?DAOFactory?getInstance?()?{
058?????????if?(null?==?instance)?{
059?????????????instance?=?new?DAOFactory();
060?????????}
061?????????return?instance;
062?????}
063?
064?????/**
065??????*?从DAO池中取对应KEY的DAO实例。
066??????*?若该实例未存在,则从DAO配置中取该DAO的Mapping,并从中取该DAO的实现类的类名,
067??????*?初始化之并将其置入池中缓存。
068??????*
069??????*?@param?key
070??????*?@return
071??????*?@throws?DAOException
072??????*/
073?????public?synchronized?DAO?findDAOByKey?(final?String?key)
074?????????throws?DAOException?{
075?????????//TODO:DAO实例是在初始化时全部创建一边还是在每次被调用时才创建???
076?????????//get?dao?instance?from?dao?pool
077?????????DAO?daoInstance?=?(DAO)?daos.get?(key);
078?
079?????????//get?dao?mapping
080?????????final?DAOMapping?daoMapping?=?daoConfig.findDAOMapping?(key);
081?
082?????????//if?null?or?different?type?bewteen?the?current?dao?and?it's?mapping
083?????????if?((null?==?daoInstance)?||
084?????????????????!daoInstance.validateType?(daoMapping.getCurrentType?()))?{
085?????????????try?{
086?????????????????final?String?daoImplClass?=
087?????????????????????daoMapping.findDAOImplClass?(daoMapping.getCurrentType?());
088?
089?????????????????if?(StringUtil.isNullOrEmpty?(daoImplClass))?{
090?????????????????????throw?new?DAOException("Not?found?DAO?implement?class?of:["?+
091?????????????????????????daoMapping?+?"]");
092?????????????????}
093?
094?????????????????//new?instance
095?????????????????Class?clazz?=?Class.forName?(daoImplClass);
096?????????????????daoInstance?=?(DAO)?clazz.newInstance?();
097?
098?????????????????//set?current?type
099?????????????????daoInstance.setCurrentType?(daoMapping.getCurrentType?());
100?
101?????????????????//add?to?dao?pool
102?????????????????daos.setFast?(false);
103?????????????????daos.put?(key,?daoInstance);
104?????????????????daos.setFast?(true);
105?
106?????????????????if?(log.isDebugEnabled?())?{
107?????????????????????log.debug?("A?DAO?instance?created:["?+?key?+?"]");
108?????????????????}
109?????????????}?catch?(ClassNotFoundException?e)?{
110?????????????????log.error?("ClassNotFoundException:"?+?e.getMessage());
111?????????????????throw?new?DAOException(e);
112?????????????}?catch?(InstantiationException?e)?{
113?????????????????log.error?("InstantiationException:"?+?e.getMessage());
114?????????????????throw?new?DAOException(e);
115?????????????}?catch?(IllegalAccessException?e)?{
116?????????????????log.error?("IllegalAccessException:"?+?e.getMessage());
117?????????????????throw?new?DAOException(e);
118?????????????}
119?????????}
120?????????return?daoInstance;
121?????}
122?}
相应的配置文件: 01???
02???
03?????"ACLService"?className="org.skyinn.quasar.acl.ACLService"/
04???
05?
06???
07???
08?????"org.skyinn.quasar.acl.dao.UserDAO1"?currentType="hibernate"
09???????"hibernate"?implClass="org.skyinn.quasar.acl.dao.hibernate.UserDAOHibImpl"/
10?????
11???
而现在在使用了spring之后,只定义了三个类或接口:
DAO DAO接口 DAOException 异常 HibernateDAO Hibernate dao 基类,
而且相应的代码不到100行: 01?/*?=====================================================================
02??*?$Id:?HibernateDAO.java,v?1.1?2004/07/26?14:38:22?l_walker?Exp?$
03??*?
04??*?Created:?[2004-7-25?0:03:47]?by?l_walker
05??*?=====================================================================*/
06?package?org.skyinn.quasar.dao;
07?
08?import?java.util.List;
09?
10?import?org.skyinn.quasar.common.PersistentObject;
11?import?org.springframework.orm.hibernate.support.HibernateDaoSupport;
12?
13?/**
14??*?HibernateDAO.java
15??*?
16??*?
17??*?View?Source
18??*?
19??*?
20??*?@author?$Author:?l_walker?$
21??*?@version?$Reversion$?$Date:?2004/07/26?14:38:22?$
22??*/
23?public?class?HibernateDAO?extends?HibernateDaoSupport?implements?DAO?{
24???private?static?final?String?KEY?=?"HibernateDAO";
25?
26???public?PersistentObject?createObject(PersistentObject?obj)?{
27?????return?(PersistentObject)?this.getHibernateTemplate().save(obj);
28???}
29?
30???public?void?updateObject(PersistentObject?obj)?{
31?????this.getHibernateTemplate().update(obj);
32???}
33?
34???public?void?deleteObject(PersistentObject?obj)?{
35?????this.getHibernateTemplate().delete(obj);
36???}
37???public?void?deleteObjectById(Class?clazz,?long?id)?{
38?????PersistentObject?obj?=
39???????(PersistentObject)?this.getHibernateTemplate().load(
40?????????clazz,
41?????????new?Long(id));
42?????if?(null?!=?obj)?{
43???????this.getHibernateTemplate().delete(obj);
44?????}
45???}
46?
47???public?PersistentObject?retriveObjectById(Class?clazz,?long?id)?{
48?????return?(PersistentObject)?this.getHibernateTemplate().load(
49???????clazz,
50???????new?Long(id));
51???}
52?????
53?????public?List?listAll(Class?clazz){
54?????????return?this.getHibernateTemplate().loadAll(clazz);
55?????}
56?????
57?????
58?}
session管理、事务等等都交由spring去处理,确实省事不少。