您的位置:首页 > 编程语言 > Java开发

Spring学习笔记 1 --Spring 是什么

2016-12-04 14:14 260 查看

Spring 是什么

Spring 是一个开源的控制反转和面向切面的容器框架,它的主要目的是简化企业开发。

控制反转:

     应用本身不负责依赖对象的创建和维护,依赖对象和维护交给外部容器负责, 也就是胡说空之权转移给了外部容器, 这个就是所谓的反转。

依赖注入:

    在运行期, 由外部容器动态的将依赖对象注入到组件

为什么要使用Spring 

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

      控制层  -》 服务层-》 DAO层    各个层次独立,实现解耦

    2)可以使用容器提供的很多服务,如事物管理,消息服务等等, 当我们使用容器事物管理时,开发人员不再需要手动控制事物,也不需要处理复杂的事物传播。

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

    4) 容器提供了AOP技术,利用他可以实现权限拦截和运行期代码监控等功能。

    5) 容器提供发很多辅助类, 可以利用这些类快速开发 JdbcTemplate ,Hibernate Template 

    6) Spring 对于主流的应用框架提供了继承支持, 如:集成Hiberate,JPA Structs 等,这样便于应用的开发 

看下列代码,不能实现事物:

public void payment(){
Bean1.update(conn);
Bean2.save(conn);
}
Public class Bean1{
public void update(Connection conn){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("update account set account=? where id =?");
}
}

Public class Bean2{
public void save(Connection conn){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("insert into account(content) value id =?");
}
}

如果想实现事物,必须对代码进行改动:
public void payment(){
Connection conn = null;
conn.setAutoCommit(false);
Bean1.update(conn);
Bean2.save(conn);
/.... 提交或者回滚事物,主要是因为一个coon的生命周期觉得
}
Public class Bean1{
public void update(Connection conn){
Statement.executeUpdate("update account set account=? where id =?");
}
}

Public class Bean2{
public void save(Connection conn){

Statement.executeUpdate("insert into account(content) value id =?");
}
}

但是如果使用Spring 就可以通过声明式的事物属性配可以轻松的实现事物需求

如果要实现bean1.update()  bean2.save() 在同一个事物中执行,那么Spring中做如下配置:
@Transational(propagation=Propagation.Required)
public void payment(){
Bean1.update(conn);
Bean2.save(conn);
/.... 提交或者回滚事物,主要是因为一个coon的生命周期觉得
}
Public class Bean1{
@Transational(propagation=Propagation.Required)
public void update(Connection conn){
Statement.executeUpdate("update account set account=? where id =?");
}
}

Public class Bean2{
@Transational(propagation=Propagation.Required)
public void save(Connection conn){
Statement.executeUpdate("insert into account(content) value id =?");
}
}

 如果想不管Bean1.update() 是否成功,都需要bean2.save 成功
可以做如下配置:

@Transational(propagation=Propagation.Required)
public void payment(){
Bean1.update(conn);
Bean2.save(conn);
/.... 提交或者回滚事物,主要是因为一个coon的生命周期觉得
}
Public class Bean1{
@Transational(propagation=Propagation.Required)
public void update(Connection conn){
Statement.executeUpdate("update account set account=? where id =?");
}
}

Public class Bean2{
@Transational(propagation=Propagation.RequiresNew)
public void save(Connection conn){
Statement.executeUpdate("insert into account(content) value (?)");
}
}

如何区分容器的轻量级还是重量级关键在于容器提供的服务多少,多重量级,少,轻量级。
例如EJB 容器 提供了EJB所有的功能,它属于重量级框架。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: