`
czx566
  • 浏览: 3561 次
  • 性别: Icon_minigender_1
  • 来自: 未来
最近访客 更多访客>>
社区版块
存档分类
最新评论

小样在胡说-2

阅读更多
    用了spring一段时间了,一直觉得是一个很好的东西,从未怀疑。但是由于最近的一次开发才突然发现,原来spring也有一些不尽人意的地方,至少我这样认为。


传统的spring开发模式下,我想大家开发应该都是这样的:
  首先定义一个interface dao
  interface UserDao{
User find(String name,String password);

}
再定义我的业务接口:
interface Login{
public boolean login(String name,String password);
}
接口定义完了,那么我就需要有我的实现,也许这样的两层我会分别交于两个不同的人去分别开发。

 
那么业务逻辑层的实现人员很有可能会按照Spring的IOC开发模式写下下面的代码:
public class LoginImpl implements Login{
private UserDao dao;

public setDao(UserDao dao){
this.dao = dao;
}

public boolean login(String name,String password){
     User user = dao.find(name,password);
     if(user!=null){
return true;
                     }else{
return false;
     }
}

}

这样貌似工作就完成了,可是如果我发现其实这个代码有下面的问题:
 
   1,过多的使用了 类变量,如果我上面的业务逻辑接口再多几个方法,那么很有可能,我的实现类先列出一排DAO
    那个时候就变成了
    public class LoginImpl implements Login{
private UserDao dao;
                  private ADAO a;
       private BDAO b;
    ......
   }
    而且这些变量的生命周期是与当前这个业务对象是一致的!
  
   2,违背OO设计的原则: 如果一个jsp程序调用的是将其强制转换为LoginImpl 类型,则jsp 程序是可以直接调用其setUser(null)这个方法而将dao设为空值或其它,而在这之后的调用,必然会对后面真正用此dao的方法产生破坏!


  3,如果我需要在这个UserDAO这个对象生成的时候,给这个对象加一层代理时,我必须将会在业务逻辑代码段中添加 加代理这样的代码,违背了Pojo设计的单纯性!


于是我觉得有必要更改spring的开发模式,于是出现了下面的代码

public class LoginImpl implements Login{

public boolean login(String name,String password){
     //此时依然也是利用spring的beanFactory去加载dao
     UserDao dao = (UserDao)BeanLoader("UserDao");
     User user = dao.find(name,password);
     if(user!=null){
return true;
                     }else{
return false;
     }
}
}
我发现上面的三个问题没有了,而spring本来所有优点基本都得到保留!我再回过头来看看这段代码,我发现我又回到了经典的工厂模式,不过决定这个工厂生产东西的不再是原来的java代码,而是我的bean.xml文件。

   基于此,我发现我用到的只是spring的类工厂,而对于spring实现的依赖注入的思想,完全是抛弃了的,灵活度却大大提高!
   那么我们为什么要依赖 Spring去注入到我们需要类中了?也许最终还是要回归到经典的23种设计模式





分享到:
评论
7 楼 czx566 2008-12-30  
hrtc 写道

又回到了ejb时代,依赖注入不用反而去用依赖查找,这样做的话你的类就和工厂耦合了。

我不这么认为,你可以看看胡说-3,不过我觉得3写的不是很清楚,最近项目比较忙,如果有可能,我会再写胡说-4 来证明 依赖注入不是万金油,那里都必须的,而一定是有边界的!
6 楼 hrtc 2008-12-30  
又回到了ejb时代,依赖注入不用反而去用依赖查找,这样做的话你的类就和工厂耦合了。
5 楼 xijinn 2008-12-20  
Ioc带来的是很重要的思想,楼主如果这么用spring,我建议你还是别用了,对你没任何好处
4 楼 czx566 2008-12-17  
hypercube1024 写道

  " 2,违背OO设计的原则: 如果一个jsp程序调用的是将其强制转换为LoginImpl 类型,则jsp 程序是可以直接调用其setUser(null)这个方法而将dao设为空值或其它,而在这之后的调用,必然会对后面真正用此dao的方法产生破坏! "老大,你到底用过Spring的IOC没有啊,IOC不一定要用set方法注入的,里面的private UserDAO userDAO;这个属性是可以直接注入的,不需要用set方法,具体的做法有很多,比如构造注入,或者直接用@Resource注释去注入都不需要用set方法,不会产生你所说的这种情况



你说的那些,我并没有提到,不是我没用过,而是我认为你列举的种种目的无非是要将
这个对象注入到另一个对象中,而我讨论的是这种目的是没有必要的~甚至认为是一种丑陋的设计。当然你实现这种目的可以有很多种方法~,但其中一种是违背面向对象的原则的!
3 楼 hypercube1024 2008-12-17  
  " 2,违背OO设计的原则: 如果一个jsp程序调用的是将其强制转换为LoginImpl 类型,则jsp 程序是可以直接调用其setUser(null)这个方法而将dao设为空值或其它,而在这之后的调用,必然会对后面真正用此dao的方法产生破坏! "

老大,你到底用过Spring的IOC没有啊,IOC不一定要用set方法注入的,里面的
private UserDAO userDAO;这个属性是可以直接注入的,不需要用set方法,具体的做法有很多,比如构造注入,或者直接用@Resource注释去注入都不需要用set方法,不会产生你所说的这种情况
2 楼 czx566 2008-12-13  
zhaomingzm_23 写道

分析的很有道理,23种模式至今还未完全弄懂.惭愧中...

我现在又觉得spring的IOC还是有用的~不过不应该向现在这么用,这个涉及到领域模型的讨论~
1 楼 zhaomingzm_23 2008-12-11  
分析的很有道理,23种模式至今还未完全弄懂.惭愧中...

相关推荐

    EXT测试小样例--EXT测试小样例

    EXT测试小样例主要目的是验证EXT Grid在实际应用中的性能、稳定性和功能完备性。这可能包括单元测试、集成测试和系统测试,确保在不同场景下EXT Grid都能正常工作。测试可能涵盖以下几个方面: 1. 功能测试:检查...

    飞腾小样列表插件

    风华小样列表窗软件是由风华软件工作室开发,面向方正飞腾3.1排版软件使用的小样列表插件。实现了排版小样的列表功能。可以一次将所有的文字和图片小样纳入小样列表窗中,排版时,将小样拖到版面上,自动形成分区。...

    网站ps小样模版

    2. **色彩理论**:颜色在网站设计中扮演着至关重要的角色,它可以影响用户的情绪和对品牌的感知。设计师在制作PS小样时会考虑色彩搭配,以传达正确的品牌形象和信息。 3. **布局与构图**:有效的布局可以使网站的...

    财政与编制政府网站-设计小样-PSD源图

    湖北某财政与编制政务公开网站首页设计小样 政府官网设计参考素材 PSD源文件 无解压密码

    论文研究-基于小样本集弱学习规则的KNN分类算法.pdf

    基于小样本弱学习规则的KNN分类算法旨在提高基于小样本集的KNN算法的分类精度,它首先对Dl中的数据对象进行学习,从中选取一些数据,利用学到的标签知识对其进行类别标号,然后将其加入到Dl中;最后利用扩展后的Dl对...

    行业分类-设备装置-一种小样用半自动分绞整经装置.zip

    在纺织行业中,分绞整经装置是至关重要的设备之一,尤其在小样生产阶段,它能够帮助提升生产效率和质量。"一种小样用半自动分绞整经装置"是专为满足这种需求而设计的创新设备。这个装置主要用于整理纱线或纤维,确保...

    迁移学习模型下的小样本人脸识别算法.pdf

    【迁移学习】在小样本人脸识别中的应用至关重要,因为传统的人脸识别系统往往依赖于大量标记的数据,但在实际情况下,获取大量标注的人脸数据并不总是可能的。迁移学习提供了一种解决方案,它允许模型从已有的大规模...

    jsp代码小样

    **JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,现在由Oracle公司维护。它允许Web开发者将HTML代码与Java..."jsp代码小样"可能就是这样一个简单的JSP页面,展示如何在实际项目中使用JSP。

    在unity 中使用XML的小样

    在Unity游戏开发中,XML(eXtensible Markup Language)是一种常见的数据存储格式,用于保存结构化数据。XML文件易于阅读和编写,并且可以被多种编程语言解析,包括C#,这在Unity中广泛用于配置文件、游戏设置、角色...

    雨篷小样图

    天津市西青区王稳庄镇农民安置房幼儿园雨篷小样图

    电子政务-全电力驱动小样织布机.zip

    电子政务-全电力驱动小样织布机.zip

    分别基于涵盖元学习、孪生网络、自蒸馏等方法在Office31和Office-home数据集跨域小样本学习源码+数据集.zip

    分别基于涵盖元学习、孪生网络、自蒸馏等方法在Office31和Office-home数据集上进行跨域小样本学习python源码+数据集.zip 分别基于涵盖元学习、孪生网络、自蒸馏等方法在Office31和Office-home数据集上进行跨域小样本...

    行业资料-交通装置-一种带有清洗装置的印染小样轧车.zip

    行业资料-交通装置-一种带有清洗装置的印染小样轧车.zip

    电子政务-全自动电脑小样织机卷曲轴燕尾槽卡纱机构.zip

    在电子政务领域,技术的应用不断推陈出新,其中“全自动电脑小样织机卷曲轴燕尾槽卡纱机构”是一种重要的技术创新。这个技术主要应用于纺织工业,特别是在小样织造过程中,它通过自动化的方式来提升生产效率和产品...

    kitti数据集小样

    在我们得到的“数据小样”中,虽然可能只是完整数据集的一部分,但仍然包含了一些关键组件,如图像和LiDAR数据,这为我们了解和实践Kitti数据集提供了宝贵的起点。 Kitti数据集分为多个子任务,其中最为知名的包括...

    行业分类-电子-关于小样电解用钢水取样器的说明分析.rar

    2. 工作流程:如何安全有效地从钢水中取得样本,包括插入和取出的操作步骤,以及如何防止样本污染或成分改变。 3. 设计创新:可能包括独特的冷却系统、防溅保护措施、易于操作的设计等,这些都可能提高取样效率和...

    OPENGL小样·

    关于图像处理的demo,一些基本函数的应用

    大师谈秘诀——游戏场景小样设定

    姜波在中国游戏行业有着20年的丰富经验,参与制作了多款成功的网络游戏如《天骄3》和《天骄2》,并且在行业内培养了许多优秀的游戏美术主管和设计师,因此他在游戏行业内备受尊敬,被誉为“设计师导师”。...

    JSP+SSM项目-彩妆小样售卖商城的Java毕业设计(源码+演示视频+说明).rar

    JSP+SSM项目-彩妆小样售卖商城的Java毕业设计(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:073】 https://pan.quark.cn/s/b3a97032fae7 【实现...

Global site tag (gtag.js) - Google Analytics