① spring是什么?
struts 是 web 框架 (jsp/action/actionfrom)
hibernate 是 orm框架,处于持久层.
spring 是容器框架,用于配置bean,并维护bean之间关系的框架
☞ spring中有一个非常概念: bean (是java中的任何一种对象 javabean/service/action/数据源./dao, ioc(控制反转 inverse of control) di( dependency injection 依赖注
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
Spring是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring的核心是控制反转(IoC)和面向切面(AOP)。
简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
特征
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring
框架
可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的
对象
不依赖于Spring的特定类。
控制反转
——Spring通过一种称作
控制反转
(
IoC
)的技术促进了低耦合。当应用了IoC,一个
对象
依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是
对象
从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了
面向切面编程
的丰富支持,允许通过分离应用的业务
逻辑
与
系统
级
服务
(例如审计(auditing)和
事务
(
transaction
)管理)进行
内聚性
的开发。
应用对象
只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或
事务
支持。
容器——Spring包含并管理
应用对象
的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置
原型
(
prototype
),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架
——Spring可以将简单的
组件
配置、组合成为复杂的应用。在Spring中,
应用对象
被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(
事务管理
、持久化框架集成等等),将应用逻辑的开发留给了你。
MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框
架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
强大的基于
JavaBeans
的采用控制反转(Inversion of Control,IoC)原则的配置管理,使得
应用程序
的组件更加快捷简易。
一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。
JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个 '终止' (finally) 模块. 并且面向JDBC的异常与Spring 通用
数据访问对象
(Data Access Object) 异常等级相一致.
以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的反转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用
数据访问对象
异常等级规范.
灵活的基于核心 Spring 功能的 MVC 网页
应用程序
框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。
提供诸如事务管理等
服务
的面向方面编程(AOP)框架。
特点
1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将
对象
之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP
编程
的支持
通过Spring提供的
AOP
功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.
声明式事务
的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的
编程
方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源
框架
,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对
Java设计模式
灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
好处
在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
Spring能有效地组织你的中间层
对象
,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的
可测试性
和
面向对象
特性。
Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数
业务对象
没有依赖于Spring。
使用Spring构建的
应用程序
易于
单元测试
。
Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性
事务
而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
1.低侵入式设计,代码污染极低
2.独立于各种
应用服务器
,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了
业务对象
替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
作用
Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
spring
首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
Spring的主要目的是使JavaEE易用和促进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有
连接池
,没有分布事务调度。这些均有
开源项目
提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据
连接池
),或由你的
应用程序
服务器
提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有友好的解决办法如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。
例如,尽管我们没有底层
事务
协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,像许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的一致性。
所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。
并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。
Spring在
应用服务器
之间是可移植的。
当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的
应用服务器
上的用户。
基本框架
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring
Spring
模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所示:
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是 BeanFactory,它是
工厂模式
的实现。BeanFactory 使用
控制反转
(IOC) 模式将
应用程序
的配置和依赖性规范与实际的应用程序代码分开。
2、Spring 上下文:Spring 上下文是一个
配置文件
,向 Spring
框架
提供上下文信息。Spring 上下文包括企业
服务
,例如
JNDI
、EJB、
电子邮件
、国际化、校验和调度功能。
3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何
对象
支持
AOP
。Spring AOP 模块为基于 Spring 的
应用程序
中的
对象
提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到
应用程序
中。
4、Spring DAO:JDBC
DAO
抽象层提供了有意义的异常层次结构,可用该结构来管理
异常处理
和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5、Spring ORM:Spring 框架插入了若干个
ORM
框架,从而提供了 ORM 的
对象
关系工具,其中包括
JDO
、
Hibernate
和
iBatis
SQL Map。所有这些都遵从 Spring 的通用
事务
和 DAO 异常层次结构。
6、Spring Web 模块:Web 上下文模块建立在
应用程序
上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring
框架
支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到
域对象
的工作。
7、Spring MVC 框架:
MVC
框架是一个全功能的构建 Web
应用程序
的 MVC 实现。通过策略接口,MVC
框架
变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、
Velocity
、
Tiles
、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring
框架
的功能可以用在任何
J2EE
服务器
中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE
服务
的可重用业务和
数据访问对象
。毫无疑问,这样的
对象
可以在不同J2EE 环境(Web 或EJB)、独立
应用程序
、
测试环境
之间重用。
案例
在不使用spring框架之前,我们的service层中要使用dao层的对象,不得不在service层中new一个对象。如下:
-
- public class UserDao{
- publicvoid insert(User user){}
- }
-
-
- public classUserService{
- publicvoid insert(User user){
- UserDaouserdao = new UserDao();
- userdao.insert(user);
- }
- }
<span style="font-size:18px;color:#000000;">//dao层对象
public class UserDao{
publicvoid insert(User user){}
}
//service层对象
public classUserService{
publicvoid insert(User user){
UserDaouserdao = new UserDao();
userdao.insert(user);
}
}</span>
存在的问题:层与层之间的依赖。
使用框架后:
-
- public class UserDao{
- publicvoid insert(User user){}
- }
-
-
- public classUserService{
- privateUserDao userdao;
-
- publicUserDao getUserdao() {
- returnuserdao;
- }
- publicvoid setUserdao(UserDao userdao) {
- this.userdao= userdao;
- }
-
- publicvoid insert(User user){
- userdao.insert(user);
- }
-
- }
<span style="font-size:18px;color:#000000;">//dao层对象
public class UserDao{
publicvoid insert(User user){}
}
//service层对象
public classUserService{
privateUserDao userdao;
publicUserDao getUserdao() {
returnuserdao;
}
publicvoid setUserdao(UserDao userdao) {
this.userdao= userdao;
}
publicvoid insert(User user){
userdao.insert(user);
}
}</span>
service层要用dao层对象需要配置到xml配置文件中,至于对象是怎么创建的,关系是怎么组合的都交给了spring框架去实现。
开发一个spring项目.
1. 引入spring的开发包(最小配置spring.jar 该包把常用的jar都包括, 还要 写日志包 common-logging.jar
2. 创建spring的一个核心文件 applicationContext.xml, [hibernate有核心 hibernate.cfg.xml struts核心文件 struts-config.xml], 该文件一般放在src目录下,该文件中引入 xsd文件 :
可以从给出的案例中拷贝一份.
3. 配置bean
<!-- 在容器文件中配置bean(service/dao/domain/action/数据源) -->
<!-- bean元素的作用是,当我们的spring框架加载时候,spring就会自动的创建一个bean对象,并放入内存
UserService userSerivce=new UserService();
userSerivce.setName("韩顺平");
-->
<bean id="userService" class="com.service.UserService">
<!-- 这里就体现出注入的概念. -->
<property name="name">
<value>韩顺平</value>
</property>
</bean>
4. 在Test.java中,我们怎么使用
//我们现在使用spring来完成上面的任务
//1.得到spring 的applicationContext对象(容器对象)
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us=(UserService) ac.getBean("userService");
us.sayHello();
1.1 spring的运行原理图:
对上面案例总结:
spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以getBean(id),使用即可.