用了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种设计模式
分享到:
相关推荐
EXT测试小样例主要目的是验证EXT Grid在实际应用中的性能、稳定性和功能完备性。这可能包括单元测试、集成测试和系统测试,确保在不同场景下EXT Grid都能正常工作。测试可能涵盖以下几个方面: 1. 功能测试:检查...
风华小样列表窗软件是由风华软件工作室开发,面向方正飞腾3.1排版软件使用的小样列表插件。实现了排版小样的列表功能。可以一次将所有的文字和图片小样纳入小样列表窗中,排版时,将小样拖到版面上,自动形成分区。...
2. **色彩理论**:颜色在网站设计中扮演着至关重要的角色,它可以影响用户的情绪和对品牌的感知。设计师在制作PS小样时会考虑色彩搭配,以传达正确的品牌形象和信息。 3. **布局与构图**:有效的布局可以使网站的...
湖北某财政与编制政务公开网站首页设计小样 政府官网设计参考素材 PSD源文件 无解压密码
基于小样本弱学习规则的KNN分类算法旨在提高基于小样本集的KNN算法的分类精度,它首先对Dl中的数据对象进行学习,从中选取一些数据,利用学到的标签知识对其进行类别标号,然后将其加入到Dl中;最后利用扩展后的Dl对...
在纺织行业中,分绞整经装置是至关重要的设备之一,尤其在小样生产阶段,它能够帮助提升生产效率和质量。"一种小样用半自动分绞整经装置"是专为满足这种需求而设计的创新设备。这个装置主要用于整理纱线或纤维,确保...
【迁移学习】在小样本人脸识别中的应用至关重要,因为传统的人脸识别系统往往依赖于大量标记的数据,但在实际情况下,获取大量标注的人脸数据并不总是可能的。迁移学习提供了一种解决方案,它允许模型从已有的大规模...
**JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,现在由Oracle公司维护。它允许Web开发者将HTML代码与Java..."jsp代码小样"可能就是这样一个简单的JSP页面,展示如何在实际项目中使用JSP。
在Unity游戏开发中,XML(eXtensible Markup Language)是一种常见的数据存储格式,用于保存结构化数据。XML文件易于阅读和编写,并且可以被多种编程语言解析,包括C#,这在Unity中广泛用于配置文件、游戏设置、角色...
天津市西青区王稳庄镇农民安置房幼儿园雨篷小样图
电子政务-全电力驱动小样织布机.zip
分别基于涵盖元学习、孪生网络、自蒸馏等方法在Office31和Office-home数据集上进行跨域小样本学习python源码+数据集.zip 分别基于涵盖元学习、孪生网络、自蒸馏等方法在Office31和Office-home数据集上进行跨域小样本...
行业资料-交通装置-一种带有清洗装置的印染小样轧车.zip
在电子政务领域,技术的应用不断推陈出新,其中“全自动电脑小样织机卷曲轴燕尾槽卡纱机构”是一种重要的技术创新。这个技术主要应用于纺织工业,特别是在小样织造过程中,它通过自动化的方式来提升生产效率和产品...
在我们得到的“数据小样”中,虽然可能只是完整数据集的一部分,但仍然包含了一些关键组件,如图像和LiDAR数据,这为我们了解和实践Kitti数据集提供了宝贵的起点。 Kitti数据集分为多个子任务,其中最为知名的包括...
2. 工作流程:如何安全有效地从钢水中取得样本,包括插入和取出的操作步骤,以及如何防止样本污染或成分改变。 3. 设计创新:可能包括独特的冷却系统、防溅保护措施、易于操作的设计等,这些都可能提高取样效率和...
关于图像处理的demo,一些基本函数的应用
姜波在中国游戏行业有着20年的丰富经验,参与制作了多款成功的网络游戏如《天骄3》和《天骄2》,并且在行业内培养了许多优秀的游戏美术主管和设计师,因此他在游戏行业内备受尊敬,被誉为“设计师导师”。...
JSP+SSM项目-彩妆小样售卖商城的Java毕业设计(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:073】 https://pan.quark.cn/s/b3a97032fae7 【实现...