使用Spring减少代码量

原创 2004年09月20日 12:46:00

http://www.skyinn.org/wiki/Wiki.jsp?page=Java_blogentry_270704_1

在使用Spring之前,DAO的配置、初始化、获取、释放等都需要自己写,
将近11个类或接口,量比较大,关系复杂,尚未包括配置文件处理、ThreadLocal、Filter等等

attach.do?page=Java_blogentry_270704_1%2Folddao.png

原来的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之后,只定义了三个类或接口:
  1. DAO DAO接口
  2. DAOException 异常
  3. 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去处理,确实省事不少。

Java基础学习总结(81)——如何尽可能的减少Java代码中bug

Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能。 不过在编写代码时,bug永远是困扰每一位从业者的头号难题。在今天的文章中...
  • u012562943
  • u012562943
  • 2016年11月18日 09:57
  • 1130

连载:编写高效代码(7) 减少函数调用——不要老打断我

函数是结构化程序设计的产物,它使代码更加模块化,耦合性更低,重用性更高。不过,函数调用会带来额外的开销,除了引起跳转外,还会产生额外的指令。         人都有这样的经验,做一件事情时,如果被人...
  • muxiqingyang
  • muxiqingyang
  • 2011年12月05日 19:43
  • 4158

程序如何做到代码复用,减少代码冗余,从而减少代码修改的成本?

1:尽量让一个人来写相关功能模块,不要把一个独立的模块分给多个人写代码。(不用你提醒,改多了他自己就知道优化代码,减少代码的冗余) 2:业务要清晰,业务不清晰不可避免的写冗余代码,(所以需要一个好的...
  • u010523770
  • u010523770
  • 2016年11月10日 17:20
  • 1490

Keil如何提升性能和减小代码大小

在编译程序的过程中,需要考虑两个问题,一个是使用的代码够不够快,另一个是编译的代码够不够小,下面汇集一些解决方法,主要针对Keil ARMCC编译器: 1,让代码够小 如图 1,未进行任何优化时,...
  • xingqingly
  • xingqingly
  • 2016年12月14日 18:28
  • 830

程序员如何减少代码的BUG量

为什么要减少BUG量
  • CrazyRock98
  • CrazyRock98
  • 2016年09月23日 14:33
  • 1564

如何减少代码的量

我始终认为,代码应作为架构的一部分,不如此,不足以表达代码质量的重要性。我知道,这与传统学院派对架构的定义是相悖的。一般认为,架构是描述设计蓝图的宏观过程,然而,敏捷方法的逐步普遍,却慢慢开始颠覆这种...
  • SmartTony
  • SmartTony
  • 2011年10月03日 13:43
  • 629

让你的代码量减少3倍!使用kotlin开发Android(一)

写在前面 使用kotlin开发android已经两周多了。得到的好处太多,敲代码简直是爽的飞起。kotlin简单,易用,代码量少。这么爽的东西,不敢私藏,所以写出来与大家分享。 可能标题说减少3倍...
  • wingichoy
  • wingichoy
  • 2016年10月08日 10:03
  • 6734

减少if语句的嵌套层次,提高代码的可读性

不合理示例: if v_type = -1 then   异常处理2 else if v_type = -2 then   异常处理2 else if v_type = 1 then   ...
  • sxdtzhp
  • sxdtzhp
  • 2015年01月25日 11:25
  • 771

减少数据传输量:使用Zip。

http://www.cnblogs.com/dlwang2002/archive/2005/06/09/207965.html 使用soap在网络上传递数据,因为数据量巨大,而导致传递速度慢。...
  • mituan1234567
  • mituan1234567
  • 2014年06月06日 18:55
  • 327

android中用style简化布局文件(减少重复代码)

android开发相对于ios有一个很大的优势,那就是可以通过xml来写布局,而且布局可以很灵活,能适应多种屏幕。但是时间久点你会发现xml中有太多的重复代码了,我真是恨死了在每次增加一个控件的时候都...
  • jinxin_cuit
  • jinxin_cuit
  • 2017年01月25日 18:20
  • 269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Spring减少代码量
举报原因:
原因补充:

(最多只允许输入30个字)