首先,声明一下自己的立场,我不是spring的反对者,顶多算是个质疑者,本文仅仅是对于过去的经验的对比和思考,没有任何反对Spring的意思在里面。 -- 汗啊,带砖头进来的同学可以先放下了。
下面开始正文:
首先要说的是思考的基础,任何框架或者语言,或者工具,我们选择他们的基础应该是他们对我们提供了什么帮助,让我们的工作和生活有了什么质的提升(ps:表激动,这是我的真实想法)。
好吧从这个基础开始我们来看一下spring究竟带给我们什么:
1. IOC控制翻转,这个就是spring翻来覆去在讲的一个东西,don't call me I will call you.
就是说在运行期间才会决定具体的类之间的调用和依赖关系。很炫,而且有好莱坞坐镇。可是真正的作用何在?
简单的想一下自己写的代码,如果没有spring的话我会直接在代码中new一个对象出来,这里面所产生的一个问题也就是在代码的调用的过程中,这些类会被翻来覆去的new出来,所以大家才想到了要进行单例,可是单例和抽象类加static方法自始至终都是一对死冤家,而且话说我觉着用static的话会减少实际的运行时方法查找的次数,对效率还会有提升的。用static的不好处之一是不OO,用java不用面向对象的思想的话好像还不如去写C。好吧,暂时当我们用OO的概念打倒了static(实际上OO对于bs所带来的好处到底是什么到目前感觉还不是很清楚)。既然static不OO那么我们就应该使用new出来的对象,这时候出现的一个问题就是对象变多,占用过多的堆内存,方法栈频繁释放之后对象的频繁回收之类的问题,所以我们现在需要一个单例。好吧到了spring起作用的地方了,运行时的function类的单例缓存。(顺便提一下,static的方法调用,如果想使用反射进行运行时参数设定会有问题,所以这也是支持使用单例的一个原因。)
好吧,我是不是说的有点儿远呢?从IOC扯到了这么多,实际上不是,实际上所有的这些都是为了说明IOC真正带给我们的好处,我所能想到的唯一的好处就是帮我产生了一个缓存的单例对象,但是为了这个单例对象我要做的是需要增加所有的spring的依赖包(这玩意让我的项目变的臃肿不堪),到处增加对于spring使用的声明(各种annotation各种xml配置,让我总感觉项目会散架,而且随时可能产生的命名冲突和配置错误总是让我提心吊胆),还有一个很长很长的学习曲线以及需要跟随潮流升级框架版本的时候带来的种种错误等等。
好吧,我要说的是enough,我的时间不是用来一直学习来对抗这种对于未知的学习和恐惧的,我的时间应该是用来向前看,不停的创造出值得自己炫耀和自豪的东西的。
当然了,到这里还不能完全说明为什么spring不是那么好,毕竟它产生了一个单例,不需要我们再去写那么多的单例代码不是吗?别着急,我们慢慢来,下面是一个单例的实例:
public class MyBean {
private static MyBean instance = null;
private MyBean(){
//do something
}
public static synchronized MyBean getInstance(){
if(instance == null){
instance = new MyBean();
}
return instance;
}
}
这是一个最简单而且拥有众多错误的单例,因为它没有实现同步,所以可能出现诸多错误,这里不再分析。下面是一个修改版,使用JVM的ClassLoader的机制进行了同步:
public class MyBean {
private static MyBean instance = new MyBean();
private MyBean(){
//do something
}
public static synchronized MyBean getInstance(){
return instance;
}
}
好处坏处都很明显,没有lazyload,但是避免了多个对象的产生。这是一个基本能用的单例,如果我们的类只是功能性的类的话(没有类属性之类的,就是那种无状态的bean,spring托管的那种),那么这种实现已经足够好了,到目前为止我所想要说的是,spring实现给我们的单例,我们自己写起来也不是太麻烦不是嘛?那么它的单例的好处何在?
下面为了维护spring的作用不得不引出spring的第二个大的特性,AOP,传说中的切面编程。
spring提供给我们的单例实际上不是简单的new出来一个对象然后注入到我们的bean里面,它产生的是一个代理对象,我们在实际进行方法调用的时候所调用的也是这个代理的对象,这时候在我们进行真正的方法调用的时候spring可以帮我们多做一点事情,此即AOP。就是说本来该调用a类的1方法,现在调用的proxy$a的1方法,然后proxy$a会在自己的方法里面调用真实的a的1方法(这拗口)。反正就是这么回事,那么我们来看看它的真实的应用空间:
事务控制,log还有什么??总之,这个特性还是不错的,但是实际上是不是还有别的替代方法呢??而且每当一个异常发生的时候面对着长长的堆栈,总让我有种想要骂娘的冲动。
让我们换个角度来想,如果我们不用spring会出现什么情况??没有spring我们需要手动在代码里面开关事务,好吧,我不想手动去做,所以我会把事务的处理代码抽象出来放到一个基础类里面,在任何需要使用事务的地方调用一下,然后呢?如果我想做的再多一点儿的话我会放弃调用基本的那种事务模型,我会自己实现一个context(应用程序上下文),在程序执行的过程中向上下文写入状态来自动决定是否启用事务,如果要求再高一点儿可以设计一个流程控制,每段function都需要绑定到该流程控制,任何一个function的失败将导致事务的回滚之类的,(当然了这些都需要根据实际情况自己去慢慢设计)。为什么我会感觉我的想法比spring略好呢?我感觉到了更低的代码侵入,更好理解的系统架构。好吧,对于AOP的讨论到此为止吧,我感觉这个功能能用,但是为了用这个功能而使用spring的话好像有什么地方不对(这个地方想好了再加吧。)
下面是关于代码管理和结构设计的几个想法:
首先代码应该层次分明,我所谓的层次分明不是指硬性的规定几个包是哪个层次,而是一种逻辑的分开,比如action层如果想要访问service层的话必须要调用一个Adapter来找到自己要访问的类,然后调用一个Executer来执行真正的操作,而不能直接引用到该类。service调用DAL亦然。
其次代码应该是模块化的,根据功能或者系统的分布,代码应该被组织成模块内可见,然后所有的模块被一个factory或者Adapter来管理,最终决定整个系统的调用关系。也就是说各个模块之间只有一个宏观范围的接口类来进行相应的分发和执行的操作。具体的实现全部隐藏在后面,对于别的模块的调用者而言完全是个黑盒。(当然有点儿过,接口还是应该暴漏出去的)。
==============无敌分割线===============先去吃午饭=====================
分享到:
相关推荐
- **创新思考**:在学习的过程中鼓励创新思考,尝试理解并实现Spring框架的核心逻辑,探索如何更好地利用Spring来解决实际问题。 #### 八、总结 通过本文介绍的简化版Spring框架的学习和实践,我们可以深入理解...
在"cloud_demo1"这个文件中,可能包含了一个简单的SpringCloud示例项目,你可以通过查看源码,了解Eureka和Feign的配置和使用方式,进一步加深理解。总的来说,SpringCloud的学习需要耐心和实践,希望你在探索过程中...
内容概要:本文详细介绍了使用Java配合Spring Boot开发框架,结合Maven和H2内存数据库开发一个小型图书管理系统的所有环节。...此外,读者还应该尝试独立思考扩展或改进系统,以提高实际开发的能力。
你可以通过查看这些代码来加深对实例工厂的理解,并尝试在实际项目中应用。记得在学习过程中,不仅要关注代码实现,还要思考为什么选择使用实例工厂,以及它如何适应不同的设计模式和架构原则。
记录一些简单示例和偶尔的思绪 2021-3-12 全结晶蓝绿,灰色发布 2020-12-25 ...ps:听说最近 Spring Cloud Alibaba 对 openfeign 和 Dubbo 做了兼容,采用降级调用 openfeign 假装 FeignAutoConfiguration F
SSH框架是Java开发Web应用程序时常用的三大框架:Struts、Spring和Hibernate的组合。这个压缩包文件包含了四个基于SSH框架的实战项目源码以及相关的学习笔记,非常适合Java初学者进行深入学习和实践。 1. **Struts...
2. **老司机进阶**:对于有一定基础的同学而言,可以尝试攻克项目的核心难点,从整体架构出发,逐步细化到各个模块,以此提升项目的完整度和技术深度。 3. **找资料顺序**:获取资料的途径非常重要。首先,应该查阅...
通过对Jdon框架的设计和实施过程的探讨,我们可以看到,作者在尝试解决实际开发中的问题时采取了一系列创新性的做法。这些做法不仅反映了他对技术趋势的深刻理解,也为后来者提供了一些有价值的参考。在未来,随着...
这个压缩包“spring-2021-main”包含了该学期所有班级的MATLAB代码实例,这些代码是学生们在学习过程中完成的任务和项目,对于理解MATLAB编程和相关知识点具有极高的参考价值。 MATLAB,全称Matrix Laboratory,以...
Jdon框架的初衷是整合Struts1.x(表现层框架)、Spring(业务层框架,包含DI和AOP)以及PicoContainer(轻量级容器),以简化开发流程。然而,作者并不满足于仅仅集成现有框架,他希望实现业务层和持久层的紧密集成...
这篇教学反思是对"I Like Spring"课程的一次深度分析和总结,教师从多个方面阐述了教学的成功之处和待改进的地方,体现了对教学方法的深刻思考和持续改进的决心。 首先,教师在课堂设计上注重创设轻松、愉快的学习...
【内容概述】: 文档内容强调了尝试、努力和坚持对于个人成长和成功的重要性,同时分享了一位软件开发工程师在2019年的具体工作经历,包括项目调研、开发、维护等方面的经验,以及个人技能的提升和面临的挑战。...
- 工作之余,工程师主动学习SpringSecurity等新技术,并尝试将其整合到自建的SSH框架中,显示出持续学习和自我提升的精神。这在快速发展的IT行业中至关重要,不断学习新的技术和工具可以提高工作效率,为公司创造更...
1. **全新项目的重要性**:在实习中,使用全新的项目有助于提升实习生的独立思考和解决问题的能力。因为没有参考代码,实习生需要自己去探索和解决遇到的问题,这有助于培养其创新和自学能力。 2. **企业级项目实战...
在描述中提到的几个项目,如"ARCH 466: SPRING 2010 RECYCLING BARCELONA’S INDUSTRIAL PORT_THALASSOTHERAPY BUILDING",是关于巴塞罗那工业港口的再利用,设计了一个海洋疗法建筑,这反映了对城市再生和可持续...
因此我们要以一种新的思维方式来重新思考Web开发,Rails、Django和TurboGears这样的动态框架给我们铺平了道路。Grails建立在这些概念之上,它极大地降低了在Java平台上建立Web应用的复杂性。与那些框架不同的是,...
这个项目是由Java和Servlet技术构建的,开发者计划在未来的迭代中尝试使用SSM(Spring、SpringMVC、MyBatis)框架进行重构。这个工程对于学习和理解企业微信API的集成以及Java Web开发具有一定的参考价值。 【描述...
在个人成长方面,他积极学习新技术,如SpringSecurity,并尝试将其整合进SSH框架,以优化开发效率。他还计划利用SSH框架构建OA系统平台,进一步提升自己的技术能力和项目实施能力。 对于未来一年的工作展望,他计划...
在实践中,你可以尝试修改和扩展这个CRM系统,例如添加新的功能模块,或者优化现有模块的性能,这样既能巩固SSH框架的使用,也能锻炼你的问题解决和系统设计能力。同时,与他人共同讨论和分享经验,是快速提升技能的...