`
FeiXing2008
  • 浏览: 53158 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring与我的经验过程

阅读更多
刚刚学习Java不久,就听过Spring这个大名。估计这个是一个牛东西,不能不学。

来来去去也就那几样:IOC,AOP开始觉得没有什么用,应是自己不会用吧。

先说说简单地使用Struts2做Web时的经历:

1.经常需要在Action里边去使用JDBC去连接数据库,也就是说每个请求就连接一次数据库。而且业务逻辑与数据库控制代码都搞在一起,代码混乱,更不用说什么脱藕之类的东西。

2.之听说有数据源这个东西,先是使用了tomcat的数据源。我是在Action类的构造器里边去写了得到datasource对象的代码。这样得到connection就方便多了,不过代码依然很混乱。而且一些数据共享与交叉业务的东西多了,代码混乱得实在不行。像数据库CRUB操作都没有很好的封装。

3.我看了Hibernate才发现有DAO这个东西,不过我还没有使用Hibernate,我使用了JDBC去写了一个DAO,突然我的代码结构好好多,CRUB + Speical逻辑都放在DAO对象里边,每个DAO对象都有一个DataSource成员。猛地发现DAO有很多共性的地方,于是写了个CommonDAO,这里放了dataSource,其中还有从tomcat得到dataSource的逻辑。


4.在我的所有DAO成形后,发现CommonDAO帮了我大忙。不过我基本使用的是自动提交事务。之后我的一项测试发现(见贴:http://feixing2008.iteye.com/blogs/571478)手动提交事务是可以提向效率的。就在DAO里边加入了好多事务相关的代码。其实事务相关的代码基本都是相同的,不过都没有什么好的方法去摆在一个地方去统一管理事务。

5.虽然很多数据库操作逻辑都放去了DAO,从JE上看到了Properties文件,然页我程序就开始出现配置文件了。不过配置很简单,只需要一个jdni名称。

6.由于请求很多时候需要数据共享的,一开始时我都是放在session里边,之后发现内存大得要命,有时每次n请求的时候需要new一个DAO,这样不好,改进办法是写了一个单例,是一个Hashtable。需要共享的对象我都放在里边了。在请求来时,再通过名字去找,也就是一个单例管理器。不过我发现,有些对象是打算一启动建好的,而这样做只是在第一个请求时去做,像一些DAO对象,是在启动后第一次请求。一直没有很好的办法在程序一启动时就会创好对象。

总结一下以上问题:
A.没有将业务逻辑代码与数据库控制代码分开。
B.只能通过JNDI拿数据源。数据源配置放在Tomcat里了。
C.事务管理代码重复。
D.每个请求都需要实例化一些资源对象,效率不高。
E.管理资源对象逻辑时间不确定,到处都是资源管理代码。
F.代码之间依赖性很强,项目代码基本不可能再复用。

之后加入新组,使用的是SSH框架所做的项目,发现Spring原来是这样子用的:
1.项目分成三层:Action,Service,DAO结构非常清晰。

2.Action里都是页面控制逻辑,也就是控制显示哪个项目。数据怎么来?
只需要写一个xxxService成员,加上@Resource注解,Spring会帮你按成员名称去注入这个对象。
形象一点说,也就是给你你想要的东西。你想要什么,写好成员加个注解,没有就报错,有就给你。

3.然后到Service层也是,如果你要某某DAO对象,很简单,写个成员,加个注解,你就有啦。DAO层同理。
所以都基本不用你去new这个东西,只需要Spring去帮你new。

4.原来Spring就是一个很大的桶,也是相当于我之前的那个Hashtable的方式去管理单例。不过Spring比我强大得多,不需要主动去拿,只说“我要”。

5.为什么Spring知道你这个类需要某某对象呢?其实很简单,因为是他将你生出来的,也就是说,它不仅仅是一个单例管理器,而且是一个工厂。所有东西都是他生出来的。而是什么叫他生的?就是通过AppliactionContent.xml之类的配置文件。我用的是2.5,可以使用注解,Spring会通过配置去搜索包里的类,如果有“我受你管理”之类的注解,就会实例,放在自己这个桶里。

6.Spring顺便在实例时,看看你需要什么东西,也就是看你成员有什么注解,你要什么我就给你什么。

7.Spring在什么时候去实例这些对象呢?如果你在普通的程序是,那当然是new XMLBeanFactory这个时候运启动Spring容器,当然不一定马上去new,启动懒加载时,要在你去拿的时候才new.
而在Web之中是在实例监听器时启动Spring的,其实在Web容器中是以监听器的身份出现。然而解决了多之前所说的管理资源对象的问题。

8.一方面拿资源对象时方便了,但是造资源对象这个问题怎样了,有了Spring轻松多了,只需要配置一个,像我喜欢用jdbc的,只需要在Spring里配一个数据源,这个数据源选择可以有很多,apache的dbcp,C3P0,XAPool 等等,都可以在Spring里边配,换了也无须改代码。

9.光光使用jdbc也不是很方便,我可以使用jdbcTemplate,这个是Spring额外给的一个工具,很不错,不用自己去关connection。还可以直接然数据装成List对象。

10.AOP事务管理,实际上就是让Spring所管理的某些类的对象的某些方法调用前与调用后,加插一些方法,如在所有以Service结尾的类中所有add开头的方法调用后就提交事务。也并没有书上说得那么复杂。

Spring用处总结:
A.Spring生你出来,具体怎么生成,通过配置去告诉Spring,之后生成的样子,在程序中感觉一样.
B.如果你是受Spring管理的,那样你可以说要主义,只需要说:“我要XX对象”,不需要写代码去拿。
C.如果你是受Spring管理的,你在做某些事情前后,会跟着,像保姆一样,怕你没有手尾。
D.额外给你一些工具类,让你受益非浅。

最后,我对Spring其实了解还不够深入,只是它让我受益非浅。其中上边很多误解与错误,希望大家抱着怀疑的心态,并多多批评,防止我误人子弟。THX
分享到:
评论
33 楼 treblesoftware 2010-03-15  
maliang.scut 写道
treblesoftware 写道
maliang.scut 写道
FeiXing2008 写道
maliang.scut 写道
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??


什么叫“在Spring使用单例模式”,你所说的瓶颈是什么东西呢?


比如,对于SampleAction,在Spring的容器中,始终都只有唯一的一个实例。
当对SampleAction的请求相对较大时,是怎样的一种情况?
会不会这些请求进入一个队列,等待这个SampleAction实例处理好上一请求。


你说的这个SampleAction本身就可以被单列,说到底就是为了调用一下。这样的对象方法根本不存在你说的队列问题。


还有一个问题就是,对于Struts2,使用Spring来对action的实例进行管理,并且约束为单例,这样做有什么好处呢?


哥,建议你看下关于多线程的东西。什么时候需要被锁,什么时候需要被同步,那些资源本身不需要被同步,或者你使用的框架类库本身就已经帮你同步。
32 楼 maliang.scut 2010-03-14  
treblesoftware 写道
maliang.scut 写道
FeiXing2008 写道
maliang.scut 写道
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??


什么叫“在Spring使用单例模式”,你所说的瓶颈是什么东西呢?


比如,对于SampleAction,在Spring的容器中,始终都只有唯一的一个实例。
当对SampleAction的请求相对较大时,是怎样的一种情况?
会不会这些请求进入一个队列,等待这个SampleAction实例处理好上一请求。


你说的这个SampleAction本身就可以被单列,说到底就是为了调用一下。这样的对象方法根本不存在你说的队列问题。


还有一个问题就是,对于Struts2,使用Spring来对action的实例进行管理,并且约束为单例,这样做有什么好处呢?
31 楼 treblesoftware 2010-03-14  
maliang.scut 写道
FeiXing2008 写道
maliang.scut 写道
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??


什么叫“在Spring使用单例模式”,你所说的瓶颈是什么东西呢?


比如,对于SampleAction,在Spring的容器中,始终都只有唯一的一个实例。
当对SampleAction的请求相对较大时,是怎样的一种情况?
会不会这些请求进入一个队列,等待这个SampleAction实例处理好上一请求。


你说的这个SampleAction本身就可以被单列,说到底就是为了调用一下。这样的对象方法根本不存在你说的队列问题。
30 楼 maliang.scut 2010-03-14  
FeiXing2008 写道
maliang.scut 写道
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??


什么叫“在Spring使用单例模式”,你所说的瓶颈是什么东西呢?


比如,对于SampleAction,在Spring的容器中,始终都只有唯一的一个实例。
当对SampleAction的请求相对较大时,是怎样的一种情况?
会不会这些请求进入一个队列,等待这个SampleAction实例处理好上一请求。
29 楼 FeiXing2008 2010-03-14  
maliang.scut 写道
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??


什么叫“在Spring使用单例模式”,你所说的瓶颈是什么东西呢?
28 楼 maliang.scut 2010-03-13  
因为对Spring使用的不多,所以一直都有一个疑问。
如果在Spring使用单例模式,那会不会造成瓶颈?
如果在Spring没有使用单例模式,那么Spring如何管理这些对象,如何生成和销毁??
27 楼 TheMatrix 2010-03-12  
楼主总结的还可以嘛,至少比我强啊,呵呵,加油!
26 楼 mhnewer 2010-03-12  
简单扼要,很好,因为明天有面试
25 楼 Angel_Night 2010-03-12  
spring的初衷当然是without ejb

时代在进步,事物也会发生改变,spring变成粘合剂已然成为事实


现在不是还有一帮人在without j2ee么...
24 楼 mercyblitz 2010-03-10  
lichao8858749 写道
直接在代码里new对象的时候,对象之间耦合太多,关系也比较复杂。 代码不好,还会影响GC的效率。Spring通过注入式编程, 将对象的管理,级联关系等全都很多的包容在这个容器里, 无论是效率,安全性等等都要好的多。



效率高在哪里?降低耦合在什么地方?

PS:貌似人云亦云啊
23 楼 yqlt 2010-03-08  
当初学spring的时候,就知道不需要new对象,用啥注入啥,但是对AOP这玩意,我到是没怎么用过。
22 楼 simlee 2010-03-01  
虽然lz可能说的不算深入,但还算浅显易懂.
对新手还是有一定帮助的.
不知道大家投隐藏是个什么心态!?
21 楼 GRDJE 2010-02-12  
呵呵, 好像没spring就编不了程了, 用个new就粘死了.....

20 楼 mwmw 2010-02-12  
spring 一个工具而已,不是什么大牛。思想最重要。
19 楼 FeiXing2008 2010-02-12  
在新加入组件时,再希望将一些组件封装成Spring的东西,然里边配置,统一管理对象,不自己搞单例。
18 楼 yyjn12 2010-02-05  
spring 的确初衷是简化开发。
许多东西都是可以选择使用的。
17 楼 FeiXing2008 2010-02-05  
treblesoftware 写道
悲剧,SPRING LZ您算白用了。SPRING当初是以简洁为开发思想的,代替繁杂的EJB过程,于降低开发难度,但是有许多地方被抛弃,不过对于大部分项目来说,影响不大。以IOC为指导的SPRING的真正经验就是:

IOC的真正作用在于可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合。

而你总结的许多东西是技术细节,许多技术框架可以替代,这些并不是SPRING的最初目的。


其实这里我就是说如何将零散东西组成起来的细节,如果用你那句,那我文章就不必出现了。
不过我真是不太清楚。目前的了解就是这样子。大家继续以质疑的心去看,因为真存有误导性。
16 楼 treblesoftware 2010-02-04  
zhouweijava 写道
lichao8858749 写道
直接在代码里new对象的时候,对象之间耦合太多,关系也比较复杂。 代码不好,还会影响GC的效率。Spring通过注入式编程, 将对象的管理,级联关系等全都很多的包容在这个容器里, 无论是效率,安全性等等都要好的多。


很好,+1

以前学spring的时候,第一认识就是不用再通过new去构造对象..方便了很多,效率也高了很多.

LZ总结的很通俗易懂,赞个!!


这是容器的特有方式,不光是SPRING,包括别的容器也有这种管理对象的能力,但是对象交给SPRING管理并不能确保这些对象的效率与安全。SPRING的最终初衷也不是只为了管理对象与NEW对象。它的目的是为了简化开发过程,容易测试。
15 楼 yunchow 2010-02-04  
Spring导致一个后果就是, 我们只需要写组件, 然后通过wave, 拼装成系统.
14 楼 songzi0206 2010-02-04  
zcy860511 写道
就打个简单的例子,LOG,其实在一开始我们所有Service都应该使用工厂的方式提供,并且为外部提供接口实现,让内部完全隐藏起来,那么在添加log的时候就完全可以使用静态代理实现,和其他代码不耦合,这样不需要AOP也能实现log。

当然,你觉得这样的代码量太大,其实不然,只需要提供一个基础log实现,那么你只需要为方法添加一点点代码而已,毕竟AOP也不能在现有代码行间添加调用吧


你大概是想说静态代理比AOP简单吧?AOP是一种思想,动态代理可以是AOP的一种实现方式,代理当然能够做很多AOP能做的事情。

相关推荐

    完整的Spring项目开发经验

    一套完整的Spring项目开发经验,从0到1,从无到有,从有到优的项目经验。助您深入理解Spring项目开发的全过程以及原理,机制。 适用人群: 适合入门级别的职场小白以及学生朋友。 适用场景及目标: 项目开发,...

    SPRING攻略 第2版.pdf

    而且,Spring能很好地与其他辅助框架(包括业务过程管理、群集缓冲以及网格计算)进行协作。 你在寻求和Ruby on Rails一样的一体化架构吗?那么你会被Grails等Spring替代方案所深深吸引,对于Groovy开发人员来说,...

    SpringFramework-5.2.7中文解析-Reactive篇

    本书编写主要目的在于翻译官方`spring.io`关于`SpringFramework`模块文档之核心篇,但是本书不仅仅是简单的...**So**我在翻译`SpringFramework`过程中会不断编写相应的示例代码、结合文档和源码分析达到更好的理解。

    SpringFramework-5.2.7中文解析-测试篇

    本书编写主要目的在于翻译官方`spring.io`关于`SpringFramework`模块文档之核心篇,但是本书不仅仅是简单的...**So**我在翻译`SpringFramework`过程中会不断编写相应的示例代码、结合文档和源码分析达到更好的理解。

    SpringFramework-5.2.7中文解析-Servlet篇

    本书编写主要目的在于翻译官方`spring.io`关于`SpringFramework`模块文档之核心篇,但是本书不仅仅是简单的...**So**我在翻译`SpringFramework`过程中会不断编写相应的示例代码、结合文档和源码分析达到更好的理解。

    SpringFramework-5.2.7中文解析-核心篇

    本书编写主要目的在于翻译官方`spring.io`关于`SpringFramework`模块文档之核心篇,但是本书不仅仅是简单的...**So**我在翻译`SpringFramework`过程中会不断编写相应的示例代码、结合文档和源码分析达到更好的理解。

    Spring攻略(第二版)高清版

    而且,Spring能很好地与其他辅助框架(包括业务过程管理、群集缓冲以及网格计算)进行协作。 你在寻求和Ruby on Rails一样的一体化架构吗?那么你会被Grails等Spring替代方案所深深吸引,对于Groovy开发人员来说,...

    SPRING攻略 第2版 (带书签)(二)

    而且,Spring能很好地与其他辅助框架(包括业务过程管理、群集缓冲以及网格计算)进行协作。 你在寻求和Ruby on Rails一样的一体化架构吗?那么你会被Grails等Spring替代方案所深深吸引,对于Groovy开发人员来说,...

    Spring配置的5种方式

    Struts2+Spring+Hibernate搭建全解! Struts2+Spring+Hibernate是J2EE的...大大小小的问题,网上也没有什么行之有效的方案或成体系的介绍,所以我就决定总结一下我的搭建过程。给一些搭 建尚存问题的朋友提供帮助。

    Spring攻略 英文第二版

    而且,Spring能很好地与其他辅助框架(包括业务过程管理、群集缓冲以及网格计算)进行协作。 你在寻求和Ruby on Rails一样的一体化架构吗?那么你会被Grails等Spring替代方案所深深吸引,对于Groovy开发人员来说,...

    spring启动componentscan类扫描加载过程

    spring启动componentscan类扫描加载过程—源码分析Java开发Java经验技巧共16页.pdf.zip

    深入解析Java Spring框架

    分享我初次接触Spring的经历,包括遇到的挑战和对框架的第一印象。探讨在学习过程中的收获和解决问题的思路。 2.2 深度理解依赖注入 详述对Spring的依赖注入机制的理解,以及它对代码可维护性和灵活性的影响。分享...

    搞定J2EE核心技术与企业应用:Ajax,JSP,Struts2,Spring,Hibernate,完整扫描版

    《搞定j2ee核心技术与企业应用:ajax,jsp,struts 2,spring,hibernate》是笔者在多年项目开发过程中的经验总结,它通过丰富的实例由浅入深、循序渐进地介绍了目前采用java进行web开发的各种框架的使用方法,从而...

    SPRING攻略 第2版 (带书签)(一)

    而且,Spring能很好地与其他辅助框架(包括业务过程管理、群集缓冲以及网格计算)进行协作。 你在寻求和Ruby on Rails一样的一体化架构吗?那么你会被Grails等Spring替代方案所深深吸引,对于Groovy开发人员来说,...

    Struts+Spring+Hibernate框架及应用开发源码

    本书分为6大部分,共33章,介绍了Struts1框架、Hibernate框架、Spring框架和Struts2框架的开发环境配置、框架技术基础,Struts1框架和Spring框架的整合,Struts1框架和Hibernate框架的整合,Struts1框架、Hibernate...

    SpringFramework-5.2.7中文解析-数据存储篇

    本书编写主要目的在于翻译官方`spring.io`关于`SpringFramework`模块文档之核心篇,但是本书不仅仅是简单的...**So**我在翻译`SpringFramework`过程中会不断编写相应的示例代码、结合文档和源码分析达到更好的理解。

    基于spring+springMvc+mybatis 开发的企业门户网站

    基于spring+springMvc+mybatis 开发的企业门户网站基于spring+springMvc+mybatis 开发的企业门户网站,适合具有一定编程基础,比如计算机专业的大学生或者1-3年工作经验的开发人员。手写简化版 Spring 框架,了解 ...

    Spring、SpringMVC和Mybatis框架整合包

    springmvc就是做前面和后面过程的活,与用户打交道!! Spring:太强大了,以至于我无法用一个词或一句话来概括它。但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括...

    基于spring+springMvc+mybatis 开发的博客样例

    基于spring+springMvc+mybatis 开发的博客样例,适合具有一定编程基础,比如计算机专业的大学生或者1-3年工作经验的开发人员。手写简化版 Spring 框架,了解 Spring 核心原理。在手写Spring 源码的过程中会摘取整体...

    java语言开发,基于spring+springMvc+mybatis 开发的大学生求职就业网

    毕业设计,java语言开发,基于spring+springMvc+mybatis 开发的大学生求职就业网样例,适合具有一定编程基础,比如计算机专业的大学生或者1-3年工作经验的开发人员。手写简化版 Spring 框架,了解 Spring 核心原理。...

Global site tag (gtag.js) - Google Analytics