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所有的功能,多以他属于重量级。

你可能感兴趣的:(Spring)