不明觉厉的spring(1)---whyspring

来源:互联网 发布:淘宝网食用菌种植方法 编辑:程序博客网 时间:2024/04/28 13:37

spring的优点

降低组件之间的耦合度,实现软件各层之间的解耦。
可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
容器提供单例模式支持,开发人员不再需要自己编写实现代码。
容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
spring提供众多服务,如jms,事务管理,持久化管理,定时调度等方便开发
例如:
不需要手动控制事务
public void save(){    Connection conn=null;//try{………………//省略代码//conn.setAutoCommit(false);//spring事务自动管理,不在需要Statement stmt=conn.createStatement();stmt.executeUpdate("…………");//conn.commit();//spring事务自动管理,不再需要………………//省略代码//}catch(Exception e){// conn.rollback();//spring事务自动管理,不在需要//}finally{conn.close()}//spring事务自动管理,不在需要}

不需要处理复杂的事务传播行为
如果不使用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;try{ conn.setAutoCommit(false);      Statement.executeUpdate(“update account set amount=? where id=?");       conn.commit()}catch(Exception e){conn.rollback();}finally{conn.close()}………………      }}public class Bean2 {      public void save(){//注意:下面省略了一些代码   ……………… Connection conn = null;try{ conn.setAutoCommit(false);      Statement.executeUpdate(“insert into Log (content) values (?)");       conn.commit()}catch(Exception e){conn.rollback();}finally{conn.close()}………………      }}

使用spring后
使用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 (?)");      }}

spring主要模块

Spring 七大核心模块

1.核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 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

为什么不是ejb

我们来了解在Java EE框架下企业级开发采用EJB框架的一些不足:

  (1) EJB太笨重,而且Entity EJB不能脱离容器

  (2) 企业级服务使用困难

  (3) 开发的复杂度太高

  (4) 侵入式方案,EJB要使用特定的接口

spring的一些重要概念

控制反转ioc(原理)依赖注入di(实现)

一种让服务消费者不直接依赖于服务提供者一 种组件设计方式,一种减少类与类之间依赖的设计原则,

一种使服务与服务提供者完全分开的设计原则,是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。

对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。

IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCSI硬盘了)。
IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

面向切面aop

将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。

实现原理请看我的另一篇博文(动态代理):
http://blog.csdn.net/senssic/article/details/10564311



原创粉丝点击