Spring使用体会:浅尝辄止
实习期间使用Spring MVC & Spring & hibernate 做了一个简单的内容管理网站。浅尝辄止,谈不上什么经验。把自己不成熟的想法写下来,欢迎拍砖。
一、 Spring 控制反转
Spring入门最先接触的的是Spring的配置文件了。
其实想法很简单,就是要告诉Spring怎么装配好一个对象,也就是Spring中所说的Bean,当其它对象需要这个bean的时候,就可以问Spring要了。
Spring配置一个Bean的形式大体如下:
<bean id= "newsService" class ="com.hs.fw.service.NewsServiceImlp"> <property name="newsDao" ref="newsDao"></ property> </bean> <bean id="newsDao" class ="com.hs.fw.dao.hibernate.NewsDaoImlp"></bean >
上面的意思是要Spring装配一个叫 newsService 和一个叫 newsDao 的Bean。严格来说,Spring将会分别装配类NewsDaoImlp 和 NewsServiceImlp 的一个单例。
上面的意思是:类 NewsServiceImlp 会有一个方法:setNewsDao,该方法接受一个参数。该参数从和而来呢?其实就是那个叫newsDao的对象。这个过程叫注入依赖。
当然上面的只是Spring配置功能的冰山一角,实际上你可以使用构造函数或工厂方法注入依赖,给Bean传入各种参数,包括基本数字、字符串、列表、映射等等,还可以控制bean的作用域。具体如何配置就不谈了,这个并不重要,只是一个表达形式而已。
Spring这样做的原因是什么呢?为了管理类之间的依赖管理,为了解开类之间的耦合。把耦合从代码中去掉,取而代之以配置文件的方式来管理。
面向对象设计中很重要的一个原则就是低耦合。一个高耦合的系统是很难维护的,当修改了一个类,其它依赖以此类的类将会受到影响,这带来的连锁反应将会令代码无法修改。
下面我们来看下类图:
可以看到,UserManagerImlp类需要依赖和数据访问层,但是它依赖的是数据访问层的接口。而具体的实现将会由Spring来负责找到,并告诉UserManagerImlp类的实例。至于Spring去找这个接口的实现,这就依靠上面提到的配置文件了。
这样做的好处是什么呢?a.我们可以轻易的修改Dao层的具体实现,只要正确的实现了接口,不用担心其他模块会受到影响。我们可以选择不同的实现技术,同时为不同数据库提供各自的实现版本,使用不同的关系数据对象映射工具,甚至使用文本文件。可以随时在不同的实现之间切换,只需要修改配置文件就可以了。
那我们是否应该把Spring反转控制引入我们的设计呢?具体问题具体分析。可以看到,上面的设计引入了很多接口,很多额外的工作。如果只是是一个练习的小项目,大可随意选择,最重要的是你是动手去做了,花太多时间在不同框架中权衡可不好。
二、 Spring MVC
Spring MVC是基于Servlet的。下面看下Spring MVC的处理流程:
处理流程解析:
(1)
前端控制器:接受来自HTTP请求,根据请求参数选择对应的控制器,并把控制器返回的数据传递至视图模板引擎。该前端控制器使用的实现是Spring
MVC框架的DispatcherServlet。
(2)
控制器:按功能划分为多个Controller,接受用户资源请求、提交请求,调用业务逻辑层完成功能,给前端控制器返回实体数据。本系统的控制器实现Spring
MVC框架的org.springframework.web.servlet.mvc.Controller接口。
(3)
业务逻辑:处理业务逻辑。
(4) 数据访问层:完成持久化对象与数据库之间的转换。
(5)
模板引擎:接受来自前端控制器的请求,把视图数据和模型数据转化成HTML,并返回给前端控制器。