1.1. Spring简介
Spring是一个开源的控制反转(IoC)和面向切面(AOP)的容器框架。它的主要目是简化应用的开发。
Spring的IOC容器包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的。
Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等。
Spring的模块图如下所示:
[img][/img]
Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring。
Spring是一个轻量级容器架构。怎么区争一个框架是属于轻量级框架还是属于重量框架呢?其实划分一个应用是否属于轻量级还是重量级,主要看它使用了多少服务。使用的服务越多,容器要为普通java对象做的工作就越多,必然会影响到应用的发布时间或者运行性能,就属于重量级的,反之就是轻量级的。
[img][/img]
对于spring容器,它提供了很多服务,但这些服务并不是默认为应用打开的,应用需要某种服务,就需要指明使用该服务。如果应用使用的服务很少,如:只使用了spring核心服务,那么我们可以认为此时应用属于轻量级的,如果应用使用了spring提供的大部分服务,这时应用就属于重量级。目前EJB容器就因为它默认为应用提供了EJB规范中所有的功能,所以它属于重量级。
Spring框架的主页:http://www.springsource.org/
下载地址:http://www.springsource.org/download
1.2. 使用Spring有什么好处
在项目中引入spring立即可以带来下面的好处
· 降低组件之间的耦合度,实现软件各层之间的解耦。
· 可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
[img][/img]
· 容器提供单例模式支持,开发人员不再需要自己编写实现代码。
· 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
· 容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
· Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
一、如果使用Spring, 我们就不再需要手工控制事务:
[img][/img]
使用Spring后,代码变为:
@Transactional
Public void save(){
sessionFactory.getCurrentSession().save(info);
}
二、如果使用spring, 我们也不需要处理复杂的事务传播行为
public void payment(){
Bean1.update();//更新金额
Bean2.save();//记录操作日志
}
如果我们不使用Spring,针对下面这两种业务需求,我们该如何做?
第1种可能的业务需求:要求Bean1.update()和Bean2.save()在同一个事务中执行。
第2种可能的业务需求:要求不管Bean1.update() 的事务是否成功,都需要记录操作日志。
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 (?)");
}
}
使用Spring,我们只需要通过声明式的事务属性配置就可以轻松地实现这两种业务需求
1.要求Bean1.update()和Bean2.save()的在同一个事务中执行
2.要求不管Bean1.update() 的事务是否成功,都需要记录日志。
@Transactional(propagation=Propagation.Required)
public void payment(){
Bean1.update();//更新金额
Bean2.save();//记录日志
}
public class Bean1 {
@Transactional(propagation=Propagation.Required)
public void update(){
executeUpdate(“update account set amount=? where id=?");
}
}
public class Bean2 {
@Transactional(propagation=Propagation.RequiresNew)
public void save(){
executeUpdate(“insert into Log (content) values (?)");
}
喜欢请关注,需要学习资料的小伙伴,请关注我,给我发私信,我持续在这条道路上坚持不懈,你们的支持是我最大的动力
本文为程序员之家原创文章,转载无需和我联系,但请注明来自程序员之家www.baldhome.com