- 浏览: 1250409 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (461)
- 心得体会 (166)
- Hibernate (9)
- Spring (12)
- Struts1 (3)
- Ajax (4)
- Java (54)
- 其他技术 (21)
- 数据库 (29)
- EXT (0)
- Struts2 (7)
- Xml (3)
- HTML (5)
- JavaScript (12)
- 面试相关 (3)
- BLOG (11)
- 计算机 (11)
- PMP (0)
- OGNL (1)
- LINUX (79)
- AIX (1)
- Ubuntu (14)
- Android (1)
- hadoop (3)
- LINUX debian (3)
- 心得体会 eclipse (2)
- JSTL (1)
- 心得体会 hadoop cdh3u5 (2)
- maven (5)
- Hive (1)
- 心得体会 工具使用 (3)
- spring data jpa Query By Example(QBE) (1)
- nginx (2)
- Apache (1)
- mysql (6)
- LINUX mysql (2)
- freemaker (1)
- 心得体会 FastDFS Nginx 断点续传 (1)
- LINUX FastDFS Nginx 断点续传 (1)
- 心得体会 Mybatis (2)
- 心得体会 mysql (4)
- php (1)
- logback 简介 (5)
- EL (1)
- Tomcat (2)
- win7 (1)
- LINUX maven (1)
- scrumworks (1)
- linux nginx (6)
- svn linux (1)
- mac (3)
- mac git (1)
- git (1)
- nexus (2)
- golang (1)
- LINUX Redis (1)
- mac oracle (1)
最新评论
-
a785975139:
有用
MySQL Error :SHOW PROFILES -
yijiulove:
弄了半天,参照你的方法解决了.特来感谢,知道可能是先加载,但是 ...
Spring和Mybatis整合时无法读取properties的处理方案 -
chenjinqi1987:
Missing com.sun.jdmk:jmxtools:jar:1.2.1 -
leifeng2:
请问怎么使用,运行之后d盘符没有生产音频文件呢?
java录音程序 -
sundful:
chenghong726 写道你好,我也遇到你这样的问题,按照 ...
Spring和Mybatis整合时无法读取properties的处理方案
笔者最近比较忙,一边在实习一边在寻找明年毕业更好的工作,不过论坛里的朋友非常支持小弟继续写,今天是周末,泡上一杯咖啡,继续与大家分享J2ee部分的学习经验。今天的主题是目前很流行也很好的一个开源框架-Spring。
引用《Spring2.0技术手册》上的一段话:
Spring的核心是个轻量级容器,它是实现IoC容器和非侵入性的框架,并提供AOP概念的实现方式;提供对持久层、事务的支持;提供MVC Web框架的实现,并对于一些常用的企业服务API提供一致的模型封装,是一个全方位的应用程序框架,除此之外,对于现存的各种框架,Spring也提供了与它们相整合的方案。
接下来笔者先谈谈自己的一些理解吧,Spring框架的发起者之前一本很著名的书名字大概是《J2ee Development without EJB》,他提倡用轻量级的组件代替重量级的EJB。笔者还没有看完那本著作,只阅读了部分章节。其中有一点分析觉得是很有道理的:
EJB里在服务器端有Web Container和EJB Container,从前的观点是各层之间应该在物理上隔离,Web Container处理视图功能、在EJB Container中处理业务逻辑功能、然后也是EBJ Container控制数据库持久化。这样的层次是很清晰,但是一个很严重的问题是Web Container和EJB Container毕竟是两个不同的容器,它们之间要通信就得用的是RMI机制和JNDI服务,同样都在服务端,却物理上隔离,而且每次业务请求都要远程调用,有没有必要呢?看来并非隔离都是好的。
再看看轻量级和重量级的区别,笔者看过很多种说法,觉得最有道理的是轻量级代表是POJO + IoC,重量级的代表是Container + Factory。(EJB2.0是典型的重量级组件的技术)我们尽量使用轻量级的Pojo很好理解,意义就在于兼容性和可适应性,移植不需要改变原来的代码。而Ioc与Factory比起来,Ioc的优点是更大的灵活性,通过配置可以控制很多注入的细节,而Factory模式,行为是相对比较封闭固定的,生产一个对象就必须接受它全部的特点,不管是否需要。其实轻量级和重量级都是相对的概念,使用资源更少、运行负载更小的自然就算轻量。
话题扯远了,因为Spring框架带来了太多可以探讨的地方。比如它的非侵入性:指的是它提供的框架实现可以让程序员编程却感觉不到框架的存在,这样所写的代码并没有和框架绑定在一起,可以随时抽离出来,这也是Spring设计的目标。Spring是唯一可以做到真正的针对接口编程,处处都是接口,不依赖绑定任何实现类。同时,Spring还设计了自己的事务管理、对象管理和Model2 的MVC框架,还封装了其他J2ee的服务在里面,在实现上基本都在使用依赖注入和AOP的思想。由此我们大概可以看到Spring是一个什么概念上的框架,代表了很多优秀思想,值得深入学习。笔者强调,学习并不是框架,而是框架代表的思想,就像我们当初学Struts一样……
1.Spring MVC
关于IoC和AOP笔者在上篇已经稍微解释过了,这里先通过Spring的MVC框架来给大家探讨一下Spring的特点吧。(毕竟大部分人已经很熟悉Struts了,对比一下吧)
众所周知MVC的核心是控制器。类似Struts中的ActionServlet,Spring里面前端控制器叫做DispatcherServlet。里面充当Action的组件叫做Controller,返回的视图层对象叫做ModelAndView,提交和返回都可能要经过过滤的组件叫做Interceptor。
让我们看看一个从请求到返回的流程吧:
(1) 前台Jsp或Html通过点击submit,将数据装入了request域
(2) 请求被Interceptor拦截下来,执行preHandler()方法出前置判断
(3) 请求到达DispathcerServlet
(4) DispathcerServlet通过Handler Mapping来决定每个reuqest应该转发给哪个后端控制器Controller
(5) 各式各样的后端控制器Controller来处理请求,调用业务层对象来处理业务逻辑,然后返回一个ModelAndView对象
(6) 当Controller执行完毕,Interceptor会调用postHandle来做后置处理
(7) ModelAndView代表了呈现画面是使用的Model数据对象和View对象,由于只能返回一个对象所有起了这个名字封装这两个对象。
(8) 由ViewResolver对象来解析每个返回的ModelAndView对象应该呈现到哪一个视图(Jsp/Html等)中(包括Exception Resolver)
(9) 当View绘制完成之后Interceptor又会跳出来执行它的afterCompletion方法做善后处理。当然Interceptor的行为完全是配置的而不是强制的。
这样一个完整的流程就这样结束了,个人感觉Spring的MVC框架稍显复杂,不像Struts-1那么容易上手。不管是Controller、Model、ViewRosovler、Handle Mapping还是View,Spring MVC框架都已经为你提供了多种实现,想最大程度的减少程序员的编码,增加框架的适用性。大家有兴趣可以继续深入研究哈!
2.Spring AOP
记得最初笔者请教他人Spring是一个什么东西的时候,每个人都会提到AOP这个词语。笔者在上一篇已经解释过AOP基本原理,这次来跟大家说说Spring的AOP编程吧。不同的AOP框架会有其对AOP概念不同的实现方式,主要的差别在于所提供的Pointcut、Aspects的丰富程度,以及它们如何被织入应用程序、代理的方式等等。先熟悉一下AOP中的几个重要概念:
(1) Cross-cutting:横切,说白了就是需要统一处理的集合
(2) Aspects:将散落各处的横切收集起来,设计成各个独立可重用的对象称为Aspects。
(3) Advice: 对横切的具体实现,即等待插入一段逻辑。
(4) Joinpoint:Advice插入流程的时机点。
(5) Pointcut: 用于选择Joinpoint的程序结构,可以通过Annotation或者XML实现。
(6) Weave: Advice被应用至对象之上的过程称之为织入,有编译期、类加载期、运行期三种时间点策略。
如果你采用实现接口的方式,Spring会在执行时期适用java的动态代理,如果不实现接口,Spring会使用CGLIB产生代理类。AOP的概念很大很泛,而Spring只使用了其中的部分特性,毕竟Spring的目标是轻量级框架,比如它只支持对Method的Joinpoint,而不支持对Field的Joinpoint,理由是为了封装性。
其实我们可以把概念看得简单一点,AOP的目的是减少冗余代码,增强对较大项目的全局监控。Spring利用AOP可以规定一个集合和一套规则,在这个集合里所有的方法被invoke即调用的时候,都必须按照那套规则走一遍。那么首先对其中10个方法都要用到的处理代码就只用写一遍,如果是这10个方法来了就织入这段代码;其次,按照规则,也许所有的牵扯某个模块的方法调用的时候,我都需要做日志或者进行验证,那么我只要立足于这个集合的入口和出口,管他从哪里来去哪里,都能被有效的监控。我监控的可能不止是某个方法单独的行为,我还可以加入对流程控制的监控规则。例如是论坛,我规定注册了才能登录,而登录后才能发帖回帖下资源,于是所有这类流程都会被收集到我眼皮地下通过。
PS:笔者最近忙于找工作的事,没有太多经历在论坛跟大家整理自己的笔记。最近也只是接触Spring的MVC比较多,对于Spring的其他特性,还没有更多的去实践,所以仅仅是泛泛而谈,只是介绍一个印象罢了。还是那句话,我们学习一个框架不是如何使用,而是它所带来的优秀的思想和理念,这比如何使用这个框架更有意义得多
引用《Spring2.0技术手册》上的一段话:
Spring的核心是个轻量级容器,它是实现IoC容器和非侵入性的框架,并提供AOP概念的实现方式;提供对持久层、事务的支持;提供MVC Web框架的实现,并对于一些常用的企业服务API提供一致的模型封装,是一个全方位的应用程序框架,除此之外,对于现存的各种框架,Spring也提供了与它们相整合的方案。
接下来笔者先谈谈自己的一些理解吧,Spring框架的发起者之前一本很著名的书名字大概是《J2ee Development without EJB》,他提倡用轻量级的组件代替重量级的EJB。笔者还没有看完那本著作,只阅读了部分章节。其中有一点分析觉得是很有道理的:
EJB里在服务器端有Web Container和EJB Container,从前的观点是各层之间应该在物理上隔离,Web Container处理视图功能、在EJB Container中处理业务逻辑功能、然后也是EBJ Container控制数据库持久化。这样的层次是很清晰,但是一个很严重的问题是Web Container和EJB Container毕竟是两个不同的容器,它们之间要通信就得用的是RMI机制和JNDI服务,同样都在服务端,却物理上隔离,而且每次业务请求都要远程调用,有没有必要呢?看来并非隔离都是好的。
再看看轻量级和重量级的区别,笔者看过很多种说法,觉得最有道理的是轻量级代表是POJO + IoC,重量级的代表是Container + Factory。(EJB2.0是典型的重量级组件的技术)我们尽量使用轻量级的Pojo很好理解,意义就在于兼容性和可适应性,移植不需要改变原来的代码。而Ioc与Factory比起来,Ioc的优点是更大的灵活性,通过配置可以控制很多注入的细节,而Factory模式,行为是相对比较封闭固定的,生产一个对象就必须接受它全部的特点,不管是否需要。其实轻量级和重量级都是相对的概念,使用资源更少、运行负载更小的自然就算轻量。
话题扯远了,因为Spring框架带来了太多可以探讨的地方。比如它的非侵入性:指的是它提供的框架实现可以让程序员编程却感觉不到框架的存在,这样所写的代码并没有和框架绑定在一起,可以随时抽离出来,这也是Spring设计的目标。Spring是唯一可以做到真正的针对接口编程,处处都是接口,不依赖绑定任何实现类。同时,Spring还设计了自己的事务管理、对象管理和Model2 的MVC框架,还封装了其他J2ee的服务在里面,在实现上基本都在使用依赖注入和AOP的思想。由此我们大概可以看到Spring是一个什么概念上的框架,代表了很多优秀思想,值得深入学习。笔者强调,学习并不是框架,而是框架代表的思想,就像我们当初学Struts一样……
1.Spring MVC
关于IoC和AOP笔者在上篇已经稍微解释过了,这里先通过Spring的MVC框架来给大家探讨一下Spring的特点吧。(毕竟大部分人已经很熟悉Struts了,对比一下吧)
众所周知MVC的核心是控制器。类似Struts中的ActionServlet,Spring里面前端控制器叫做DispatcherServlet。里面充当Action的组件叫做Controller,返回的视图层对象叫做ModelAndView,提交和返回都可能要经过过滤的组件叫做Interceptor。
让我们看看一个从请求到返回的流程吧:
(1) 前台Jsp或Html通过点击submit,将数据装入了request域
(2) 请求被Interceptor拦截下来,执行preHandler()方法出前置判断
(3) 请求到达DispathcerServlet
(4) DispathcerServlet通过Handler Mapping来决定每个reuqest应该转发给哪个后端控制器Controller
(5) 各式各样的后端控制器Controller来处理请求,调用业务层对象来处理业务逻辑,然后返回一个ModelAndView对象
(6) 当Controller执行完毕,Interceptor会调用postHandle来做后置处理
(7) ModelAndView代表了呈现画面是使用的Model数据对象和View对象,由于只能返回一个对象所有起了这个名字封装这两个对象。
(8) 由ViewResolver对象来解析每个返回的ModelAndView对象应该呈现到哪一个视图(Jsp/Html等)中(包括Exception Resolver)
(9) 当View绘制完成之后Interceptor又会跳出来执行它的afterCompletion方法做善后处理。当然Interceptor的行为完全是配置的而不是强制的。
这样一个完整的流程就这样结束了,个人感觉Spring的MVC框架稍显复杂,不像Struts-1那么容易上手。不管是Controller、Model、ViewRosovler、Handle Mapping还是View,Spring MVC框架都已经为你提供了多种实现,想最大程度的减少程序员的编码,增加框架的适用性。大家有兴趣可以继续深入研究哈!
2.Spring AOP
记得最初笔者请教他人Spring是一个什么东西的时候,每个人都会提到AOP这个词语。笔者在上一篇已经解释过AOP基本原理,这次来跟大家说说Spring的AOP编程吧。不同的AOP框架会有其对AOP概念不同的实现方式,主要的差别在于所提供的Pointcut、Aspects的丰富程度,以及它们如何被织入应用程序、代理的方式等等。先熟悉一下AOP中的几个重要概念:
(1) Cross-cutting:横切,说白了就是需要统一处理的集合
(2) Aspects:将散落各处的横切收集起来,设计成各个独立可重用的对象称为Aspects。
(3) Advice: 对横切的具体实现,即等待插入一段逻辑。
(4) Joinpoint:Advice插入流程的时机点。
(5) Pointcut: 用于选择Joinpoint的程序结构,可以通过Annotation或者XML实现。
(6) Weave: Advice被应用至对象之上的过程称之为织入,有编译期、类加载期、运行期三种时间点策略。
如果你采用实现接口的方式,Spring会在执行时期适用java的动态代理,如果不实现接口,Spring会使用CGLIB产生代理类。AOP的概念很大很泛,而Spring只使用了其中的部分特性,毕竟Spring的目标是轻量级框架,比如它只支持对Method的Joinpoint,而不支持对Field的Joinpoint,理由是为了封装性。
其实我们可以把概念看得简单一点,AOP的目的是减少冗余代码,增强对较大项目的全局监控。Spring利用AOP可以规定一个集合和一套规则,在这个集合里所有的方法被invoke即调用的时候,都必须按照那套规则走一遍。那么首先对其中10个方法都要用到的处理代码就只用写一遍,如果是这10个方法来了就织入这段代码;其次,按照规则,也许所有的牵扯某个模块的方法调用的时候,我都需要做日志或者进行验证,那么我只要立足于这个集合的入口和出口,管他从哪里来去哪里,都能被有效的监控。我监控的可能不止是某个方法单独的行为,我还可以加入对流程控制的监控规则。例如是论坛,我规定注册了才能登录,而登录后才能发帖回帖下资源,于是所有这类流程都会被收集到我眼皮地下通过。
PS:笔者最近忙于找工作的事,没有太多经历在论坛跟大家整理自己的笔记。最近也只是接触Spring的MVC比较多,对于Spring的其他特性,还没有更多的去实践,所以仅仅是泛泛而谈,只是介绍一个印象罢了。还是那句话,我们学习一个框架不是如何使用,而是它所带来的优秀的思想和理念,这比如何使用这个框架更有意义得多
发表评论
-
Java数字、货币值和百分数等的格式化处理
2016-09-13 18:36 967如果我们用下列语句输出一个数 System.out.pri ... -
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
2016-08-17 09:01 1158公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁 ... -
jstat查看jvm的GC情况[转]
2016-08-17 08:58 792jps(Java Virtual Machine Proce ... -
Java 7, Ubuntu 12.10 64bit issues
2015-04-13 11:57 1373At first Maven failed with the ... -
Map遍历的两种方式
2014-10-20 11:09 916第一种: Map map = new HashMap() ... -
对Map按key和value分别排序
2014-10-20 11:01 955一.理论准备 Map是键值对的集合接口, ... -
【转】程序包com.sun.image.codec.jpeg不存在 问题的完美解决
2014-10-09 13:43 1286maven下面编译失败,失败提示信息为:程序包com.sun ... -
关于系统读取properties配置文件的路径问题,包括打成jar包的运行文件
2014-10-08 18:05 1828在当前的一个项目中, ... -
java中的equals和hashCode(转载)
2014-01-15 14:01 871在某些时候,我们需要判断两个对象是否相等。Java的每个类都继 ... -
关于java中BufferedReader的read()及readLine()方法的使用注意
2013-06-05 16:08 2635以前学习的时候也没有太在意,在项目中使用到了才发现呵呵 1 ... -
java -cp
2013-04-19 12:03 1464java -cp classpath Specify a ... -
maven 打包可执行jar的方法
2013-04-19 12:02 48861.修改pom.xml增加如下内容 [html] ... -
Java 反射测试
2010-08-10 16:54 1305import java.lang.reflect.Invoca ... -
Creating Dynamic Web Project using Maven in Eclipse
2010-08-10 13:10 2864While using Maven as build tool ... -
建立你自己的本地仓库(Maven仓库管理-Nexus)
2010-07-02 13:34 4101这一个章节,我分两部分来介绍,首先介绍一下Maven的仓库,然 ... -
Java枚举类
2010-04-13 11:30 68121.创建一个最简单的枚 ... -
Java堆.栈和常量池 笔记
2010-04-07 09:26 12281.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程 ... -
探讨代理模式与Java反射机制的应用
2010-04-01 09:53 1087代理模式,相信大多数人都非常熟悉,常见的实现方式是通过公共接 ... -
Java的代理模式(通过公共接口实现)
2010-04-01 09:51 1234代理模式的一种常见的实现方案是,定义一个接口或抽象类,并派生出 ... -
Java多线程编程要点
2010-03-31 09:30 11121、 认识Thread和Runnable Java中实现 ...
相关推荐
Java学习杂谈系列涵盖了许多关于Java编程的基础概念和机制,以下是对这些知识点的详细解读: 1. **动态加载机制**: 动态加载机制是Java语言的一个关键特性,它使得程序在运行时才能确定哪些类需要加载。当你声明...
### Java学习杂谈:深入解析Java的动态加载机制、类搜索原理及JDK与JRE的区别 #### 动态加载机制解析 Java的学习者往往在掌握面向对象编程(OOP)概念时,会遇到“动态加载机制”这一关键点。相较于C++中面向过程...
"主流编程语言的选择和学习杂谈" 本文主要介绍了当前主流编程语言的特点、发展趋势和学习方法,为新手提供了学习参考。 一、Java 语言 Java 语言是由 Sun 公司开发的,目前由 Java Community Process 控制。Java ...
[学习资料] 09年Java认证考试:我的Java学习道路 [学习资料] 09年Java认证考试:学好java开发的关键七步 [学习资料] 09年Java认证考试:JAVA求素数算法实现 [学习资料] 09年Java认证考试:java类的构造方法 [学习...
此外,随着Java版本的更新,一些机制可能会有所变化,例如类加载器的工作方式在JDK 1.4到1.6之间可能有所调整,因此持续学习和跟踪Java的最新发展也是必要的。 总之,Java的动态加载机制、类加载器的工作原理以及...
例如,Python有PEP 8,Java有Google Java Style Guide,这些都是值得遵循的编码规范。 最后,项目管理在大型项目中扮演着重要角色。了解敏捷开发理念,如Scrum或Kanban,可以帮助团队有效地组织和管理任务。同时,...
总的来说,《Java陈国君(第二版)课件》是一个全面的Java学习资源,无论你是零基础的新手,还是希望进一步提升的开发者,都能从中受益匪浅。通过深入学习和实践,你将能够掌握Java编程的核心技能,为未来的编程生涯...
### Java框架知识学习 #### Struts 1.x **手写MVC框架** - **概念理解**:在探讨Struts框架之前,先了解MVC(Model-View-Controller)架构模式的基本原理。这是一种广泛应用于软件工程的设计模式,尤其是用于Web...
**1.6 JAVA面试题解惑系列(六)——字符串(String)杂谈** - **知识点**:深入探讨字符串处理技术,包括字符串拼接、比较、格式化等常见操作的内部实现,以及性能优化建议。 **1.7 JAVA面试题解惑系列(七)——...
- 发布工具:Jenkins是自动发布工具的首选,它既关乎管理人员的经验,也关系到开发人员的学习与适应能力。Jenkins能够在持续集成中发挥关键作用,提高软件交付的速度和质量。 - Bug管理:合理的Bug管理能够确保软件...
“JAVA面试题解惑系列(六)——字符串(String)杂谈”可能涉及到String池的概念,即JVM会缓存重复的字符串,以提高性能。此外,String的equals()和==的区别也常常是面试的焦点,前者比较内容,后者比较对象引用。 ...
【JAVA面试题解惑系列】是一系列专门...以上只是《JAVA面试题解惑系列》中部分主题的简要介绍,每篇文章都深入探讨了相关主题,为面试者提供了丰富的学习资料。掌握这些知识点,将有助于在面试中表现出扎实的Java基础。
C++或Java则适合深入理解面向对象编程。 3. **算法与数据结构**:程序设计的核心是解决问题,这往往涉及算法的选择和应用。基础算法如排序(冒泡、快速、归并)、查找(线性、二分)以及递归等,是每个程序员必备的...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是一个广泛使用的开源企业级应用开发平台,由Oracle...通过深入学习和实践这两个技术,开发者可以更好地应对复杂的业务场景,打造健壮、可维护的Java应用。
这篇"Android开发杂谈"涵盖了从系统组成、启动过程到关键组件的解析,旨在为初学者提供一个全面的理解框架。 Android系统是由多个层次构成的,包括Application、Framework、Native Libraries、Userspace Drivers...
Swing是Java编程语言中用于构建图形用户界面(GUI)的一个工具包,它是Java Foundation Classes ...通过学习和理解这个初版本的源码,开发者能够更好地掌握Swing的使用,并在此基础上构建更复杂的Java GUI应用程序。
深入浅出 例子实用 代码丰富 是java程序人员学习和深入数据结构和算法的实用读物 由于资源过大,分两部分上传 本资源为第二部分
综上所述,“java俄罗斯方块”项目涵盖了Java编程中的许多核心概念和技术,是学习和实践Java GUI编程、多线程、游戏开发和数据处理的绝佳案例。通过这个项目,开发者不仅可以掌握Java编程基础,还能深入理解游戏开发...