Spring学习笔记——为何使用Spring

在我们的项目中我们可以不用Hibernate、可以不用Struts、可以不用ibatis但是我们几乎每一个项目都用到了Spring,这是为什么?下面让我们分析下Spring有何优点:

1、降低组件之间耦合,实现软件各层之间的解耦

2、可以使用容器提供的众多服务,如:事务管理、消息服务等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需要处理负责的事务传播。

Hibernate的事务操作:

public void save(){
    Session session = SessionFactory.getCurrentSession();
    session.beginTransaction();
    session.save("internet finance");
    session.getTransaction().commit();
}

JDBC的事务操作:

Connection conn = null;
try{
    ...
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("update balance = 100000 where account = ‘622545878411212‘");
    conn.commit();
    ....
}catch(Exception e){
    conn.rollback();
}finally{
    conn.close();
}

如果我们使用Spring,我们也不需要处理复杂的事务传播行为看下面一个例子:

public void payment(){
    Bean1.update();// 更新金额
    Bean2.save();// 记录操作日志
}
// 如果我们不使用Spring,针对下面两种业务需求我们该怎么做?
// 1、要求Bean1和Bean2的操作方法在同一个事务中执行
// 2、要求不管Bean1的操作是否成功,我都记录日志
public class Bean1{
    public void update(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("update account set amount = ? where id = ?");
    }
}
public class Bean2{
    public void save(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("insert into log(content) values (?)");
    }
}

很明显此时两个Bean的方法在在两个事务中(满足第二种业务场景),因为他们各自有自己的Connection,如果要满足第一种业务场景我们可以进行如下改造:

public void payment(Connection conn){
        Connection conn = null;
        conn.setAutoCommit(false);
    Bean1.update(conn);// 更新金额
    Bean2.save(conn);// 记录操作日志
}
public class Bean1{
    public void update(Connection conn){
        Statement.executeUpdate("update account set amount = ? where id = ?");
    }
}
public class Bean2{
    public void save(Connection conn){
        Statement.executeUpdate("insert into log(content) values (?)");
    }
}

下面我用Spring来实现这两种业务场景:

第一种业务场景

// 使用Spring声明式事务属性配置
@transactional(propagation=Propagation.Required)
public void payment(){
    Bean1.update();// 更新金额
    Bean2.save();// 记录操作日志
}
public class Bean1{
    @transactional(propagation=Propagation.Required)
    public void update(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("update account set amount = ? where id = ?");
    }
}
public class Bean2{
    @transactional(propagation=Propagation.Required)
    public void save(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("insert into log(content) values (?)");
    }
}

第二种业务场景

// 使用Spring声明式事务属性配置
@transactional(propagation=Propagation.Required)
public void payment(){
    Bean1.update();// 更新金额
    Bean2.save();// 记录操作日志
}
public class Bean1{
    @transactional(propagation=Propagation.Required)
    public void update(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("update account set amount = ? where id = ?");
    }
}
public class Bean2{
    @transactional(propagation=Propagation.RequiredNew)
    public void save(){
        Connection conn = null;
        conn.setAutoCommit(false);
        Statement.executeUpdate("insert into log(content) values (?)");
    }
}

3、Spring提供单例模式支持,开发人员不再需要自己编写代码实现

4、容器提供AOP技术,利用它很容易实现如权限拦截、运行期监控等功能

5、容器提供了众多的辅助工具类,这些类能够加快应用的开发,如:JDBCTemplate、HibernateTemplate

6、Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等

轻量级和重量级划分

主要看它使用了多少服务,使用的服务越多,容器要为普通Java对象做的工作越多,必然会影响到应用的发布时间或者运行性能。

对于Spring容器,它提供了很多服务,但这些服务并不是默认为应用打开的,应用需要某种服务,还需要指明使用该服务,如果应用使用服务很少,如:只使用了Spring的核心服务则认为他是轻量级;如果应用使用了Spring的绝大部分服务,这时应用就是重量级。目前EJB容器就因为他默认为应用提供了EJB所有的功能,多以他属于重量级。

时间: 2025-01-09 06:38:05

Spring学习笔记——为何使用Spring的相关文章

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这

Spring学习笔记一(Spring核心思想)

通过学习<Spring in action (Third edition)>的第一章,我大概了解了Spring的基本思想: 1,依赖注入(Dependnecy Injection): 在不使用Spring框架的情况下,一个类要跟另一个类建立联系,可能会使用如下的模式: class A{...} class B{ private A a; ...       } 这样的话,每次实例化一个B的对象,如b1,必定实例化一个A的对象,如a1,并且b1和a1是紧耦合的,b1牢牢地和a1绑定在一起了.他们

Spring学习笔记一(Spring简单介绍)

1.前言 从今天起开始写几篇关于Spring的文章,来总结一下,近来的学习情况,也想与大家分享一下学习Spring的心得和体会.希望大家能够多多指正.  2.Spring简单介绍 上图是有关Spring的整个架构图,从图中我们可以看出,Spring主要包括AOP.数据访问,WEB访问等几大块内容. Spring是一个基于JAVA的轻量级J2EE的应用框架. 那么Spring能干什么呢?目前我们看到市面上有很多的框架,比如Struts2+Spring.Spring+Servlet.Spring+i

【Spring学习笔记-MVC-13】Spring MVC之文件上传

作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver. 下面将具体讲解Spring MVC实现文件上传的具体步骤. 2. 添加Jar包 Spring MVC文件上传,需要添加如下两个jar包: commons-fil

【Spring学习笔记-MVC-10】Spring MVC之数据校验

作者:ssslinppp       1.准备 这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar.jboss-logging-3.1.0.jar.validation-api-1.0.0.G

【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问

作者:ssslinppp       参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html 优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往使用

spring学习笔记四:spring常用注解总结

使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.xxx" /> 1.定义Bean @Component 需要在类上面使用注解@Component,改注解的vlan属性用于指定改注解的ID的值 spring还提供三个功能基本和@Component等效的注解 @Repository 用于对DAO实现类进行注解 @Service         

【Spring学习笔记-MVC-7】Spring MVC模型对象-模型属性讲解

作者:ssslinppp       来自为知笔记(Wiz) 附件列表 处理模型数据.png

【Spring学习笔记-MVC-17】Spring MVC之拦截器

作者:ssslinppp       1. 拦截器简介及应用场景 2. 拦截器接口及拦截器适配器 3. 运行流程图 正常运行 中断流程 4. 程序实例 控制层: @Controller @RequestMapping(value = "/test") public class TestController { @RequestMapping(value = "/interceptor12") public String interceptor12() { Syste