AI-JavaEE-Spring-Introduction

  • 格式:pdf
  • 大小:2.27 MB
  • 文档页数:44

基于传统OO设计的解决方案
这种设计方案有两个缺陷: ① 业务逻辑对象除了实现业务接口外,还必须实现或继 承容器特有的接口或基类(如EJB 2.x的SessionBean 接口等等),这对业务对象造成了侵入,使其难以移 植到别的应用环境。
由于基础设施都是通过回调接口提供,所以“可以提
供哪些基础设施服务”实际上是预先规定好的,不能根 据需要定制。比如说,原来有事务管理、安全检查等 基础设施服务,现在突然需要日志、异常处理等基础 设施服务,那么非常遗憾,容器提供的接口上没有相 关的回调方法,所以无法提供这样的基础设施。
Spring AOP
OOP的尴尬
• 目前,OOP是主流的程序设计方法。当 对现实世界进行抽象和建模、对客观实 体及其属性和行为进行封装时,OOP展 示了强大的功能,但是当对跨越多个模 块(或类)的行为进行建模时,OOP却 陷入了困境。
Problems like…
logging in org.apache.tomcat • red shows lines of code that handle logging • not in just one place • not even in a small number of places
和Spring相似的框架
• • • • •
PicoContainer NanoContainer Google Guice Jdon Framework ……
Spring IoC
从耦合(或曰依赖)说起
什么耦合(或曰依赖)?
如果改变程序的一个模块要求另一个 模块同时发生变化,就认为这两个模块 发生了耦合。
• AOP技术给人们提供了一个崭新的视角分析 和设计软件系统,能很好的解决横切关注点问 题。
AOP与OOP
OOP编程的基本流程: 1. 归纳分析系统,抽象领 域模型; 2. 使用class来封装领域模 型,实现类的功能; 3. 把各个相关联的类组装 到一起形成一个完整的 系统。 AOP编程基本流程 1. 归纳分析系统中的关注 点,分解切面; 2. 按模块化的方式实现各 个关注点中的功能,可 以使用传统的编程方法 如OOP; 3. 按一定的规则组合切面( 织入或集成),形成一个 完整的系统。
什么是IoC/DI
public class Client { // 面向接口定义,不依赖于具体类了 ServiceIntf service; public void setSevice(ServiceIntf service) { this.service = service; } …… service.doSomething(); }
基于传统OO设计的解决方案
基于传统OO设计的解决方案
• 对于基础设施(Infrastructure)功能, 如果用传统的OO设计来进行解耦合处理 ,一般采用Template Method模式来实现 :业务逻辑对象实现特定的接口,或继 承特定的基类,通过接口提供的 Callback方法提供基础设施服务。
充当着黏合剂的作用,集成各种优秀的开源框架和第 三方类库。 降低了Java EE API的使用难度。 Spring源码是学习Java EE设计的经典范例。
Spring体系结构
Spring的子项目
• • • • • • • • • • Spring Web Flow Spring Security(Acegi Security) Spring Web Services Spring LDAP Spring Rich Client Spring Extensions Modules Spring IDE for Eclipse Spring BeanDoc Spring OSGi Spring .NET
<bean id=“customerService” class=“soft.crm.service.CustomerService">
<property name=" customerDao" ref=" customerDao"/> <property name="itemDao" ref="itemDao"/> </bean>
Spring带给我们什么
利用IoC/DI组装各种组件对象,将依赖关系从代码转 移到框架,很好地消减了Coupling。
通过AOP,将Transaction、 Security、 Logging、 Exception等从业务逻辑中分离出来,更方便地实现声 明性基础设施服务。 非常优雅的Spring DAO封装,让我们不用再为数据访 问资源、异常等的管理而烦心。
—— 《Reducing Coupling》
(作者:Martin Fowler,ThoughtWorks首席科学家)
从耦合(或曰依赖)说起
从耦合(或曰依赖)说起
1、零耦合(Nil Coupling)
• 如果两个类没有耦合关系,就称之为零耦合。
2、具体耦合(Concrete Coupling)
• 具体耦合发生在两个具体的(可实例化的)类之间, 经由一个类对另一个具体类的直接引用造成。
Type2 构造函数注入
public class Client { private ServiceIntf service; public Client(ServiceIntf service) { this.service = service; } …… service.doSomething(); }
<bean id="customerDao" class=“soft.crm.dao.jdbc.customerDao">
<property name="dataSource" ref="dataSource"/> <property name="sqlMap" ref="sqlMap"/> </bean>
More problems...
• 权限检查:如果需要给业务方法加上基 于角色的访问控制,就必须逐个方法进 行修改。 • 事务管理:如果访问数据库,必须在每 个操作之前开启事务,操作结束后提交 或回滚事务。 • 异常处理:每一个方法都要套上 tyr…catch…finally这样臃肿的外衣。 • 。。。。。。
AOP到底是什么
• AOP,即:Aspect Oriented Programming, 最初被译为“面向方面编程”,但现在更倾向于“ 面向切面编程”的译法,因为它更加达意。
• 作为一种编程思想,AOP最初是由Gregor Kiczales在施乐的Palo Alto研究中心领导的一 个研究小组于1997年提出。
关于类库和框架
• 类库给用户提供了一系列可复用的类,这些类 的设计都符合面向对象设计原则和模式。 • 用户使用类库时,可以创建这些类的实例,或 从这些类中继承出新的派生类,然后调用类中 相应的功能。 • 在这一过程中,类库总是被动地响应用户的调 用请求。
关于类库和框架
• 框架是一个“半成品”的应用程序,包含了应用 程序运行的主要流程,流程中那些无法预先确 定的部分留给用户来实现。 • 在使用一个框架时,应用程序代码不会直接调 用框架的API,而是根据框架的要求留下特定 接口,由框架来调用应用程序。框架是IoC/DI 的完美体现。 • 在这一过程中,框架系统的行为是主动的:控 制权从调用端代码转移框架,由框架来注入依 赖关系。
什么是IoC/DI
public class Client { // 完全依赖于具体类 Service service = new Service(); …… service.doSomething(); }
public class Service { }
什么是IoC/DI
public class Client { // 面向接口定义,但还有依赖 ServiceIntf service = new ServiceImpl(); …… service.doSomething(); } public class ServiceImpl implements ServiceIntf { } public interface ServiceIntf { }
3、抽象耦合(Abstract Coupling)
• 抽象耦合关系发生在一个具体类和一个抽象类(或 者接口)之间,使两个必须发生关系的类之间存有 最大的灵活性。
依赖倒转原则(DIP)
• 表述零:Dependency Inversion Principle • 表述一:上层模块不应当依赖于下层模 块,他们共同依赖于一个抽象。
Spring Framework Overview
AsiaSoft Institute
香港永亚软件学院
内容提要
✔ Spring 概述
✔ Spring IoC
✔ Spring AOP
Spring 概述
Why Spring
Why Spring
• 更方便地面向接口编程 • 更方便地面向切面编程
一句话描述Spring
IoC/DI的类型
构造函 数注入
属性设 置注入 接口注 入
IoC/DI的三种主要类型
Type1 属性设值注入
public class Client { private ServiceIntf service; public void setSevice(ServiceIntf service) { this.service = service; } …… service.doSomething(); }
• 表述二:抽象不能依赖于具象,具象依 赖于抽象。
依赖倒转原则(DIP)