Spring实战(一)

 

第一章、Spring之旅

Spring是一个开源的架构,是为了解决企业级应用开发的复杂性而创建的,且Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性与松耦方面从Spring受益。其根本的使用就是简化企业级应用开发的复杂性而创建的,使用Spring可以使得简单的Spring Bean实现之前EJB才能实现的事情。

Java组件开发理念,AOP和DI为JavaBean提供了之前EJB提供的强大功能,这些技术为POJO提供了类似EJB的声明式编程模型。

POJO(Plain Oridinary Java Object)简单的Java对象,实际上就是普通JavaBeans,为了便面和EJB混淆所创造的简称。

EJB(Enterprise Java Beans)称为企业Java Beans,其诞生标志Java Beans运行正式从客户端领域扩展到服务器领域。

 

虽然Spring使用Bean或者JavaBean来表示任何应用组件,并不意味着Spring组件必须遵循

JavaBean规范;一个Spring组件可以是任何形式的POJO;很多框架通过强迫应用集成他们的类或者实现接口从而使得应用与框架绑死;而Spring不会强迫你实现Spring规范的接口或集成Spring规范的类;

Spring赋予POJO方式之一就是通过依赖注入装配它们,帮助应用对象彼此之间保持松耦合。

 

基于POJO的轻量级和最小侵入性编程、 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码

 

1.1.2 依赖注入

现今已演变成为一项复杂编程技巧或设计模式理念,任何具备实际意义的应用都是由两个或多个类组成,类之间的相互协作完成特定的业务逻辑,通常每个对象管理与自己相互协作的对象的引用,然而这将导致高度耦合与难以测试的代码

耦合具有双面性,一方面,紧密耦合使得代码难以测试,难以复用和理解,容易出现打 地鼠式的Bug,修复一个Bug导致出现新的或者更多的Bug;另一方面,一定程度的耦合又是 必须的,没有耦合的代码什么都做不了。 通过依赖注入(DI),对象的依赖关系将由系统中负责协调各对象的第三方组件在创建 对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,如图1.1所示,依赖关系将 被自动注入到需要它们的对象当中去

 

 

如果一个对象只通过接口(而非具体实现或初始化的过程)来表明依赖关系,那么这种 依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。

不自行创建任务,而是构造时将任务作为构造器参数传入,这是依赖注入的方式之一,即构造器注入;创建应用组件之间协作行为称为装配,常采取XML配置方式进行装配;

Spring通过应用上下文(Application Context)装载Bean的定义并把他们组装起来,并全权负责对象的创建和组装,在main()方法中调用ClassPathXmlApplicationContext加载上述的xml文件。

 

类不清楚当前执行的任务,只有xml文件直到执行的任务

总而言之,大致过程分为:(1)注入(2)装配(3)装载(后序称为创建、装配、配置还有管理生命周期)

 

1.1.3应用切面

依赖注入让相互协作的组件保持松散耦合,而AOP编程允许将遍布应用各处的功能分离出来形成可重用的组件。其还被定义为促使应用程序分离关注点的一项技术,系统由许多不同组件组成,每个组件各负责一个特定功能,诸如日志、事务管理和安全的系统服务融入到由自身核心逻辑的组件中,这些系统服务称为横切关注点,因为他们总是跨越系统的多个组件。AOP将这些服务模块化,并以申明的方式将他们应用到需要他们需要影响的组件中去,这些组件因此具备更高内聚性和更加关注自身业务,无需了解涉及的系统服务的复杂性。

如果将这些关注点分散到多个组件中,代码将会引入双重复杂性:

(1)实现系统关注点功能的代码将会重复出现在多个组件中,即需要修改逻辑的时候必须修改每个模块中的相关实现;

(2)组件因为与自身核心业务无关的代码变得混乱。

 

AOP使得这些服务模块化,并以申明的方式将它们应用到需要影响的组件中,使得组件具备更高的内聚性以及更加关注自身业务,完全不需要了解可能设计的系统服务的复杂性。可以视AOP为覆盖很多组件上的外壳,以申明的方式灵活应用到系统中。

 

案例:

 

首先将Minstrel申明为一个Bean,然后在<aop:aspect>元素中引用该Bean;<aop:before>申 明在embarkOnQuest()方法前调用Minstrel中的singBeforeQuest()方法;同理<aop:after> 表示申明在embarkOnQuest()方法后调用Minstrel中的singAfterQuest()方法;上述分别称 为前置通知与后置通知;两种方式中,piointcut-ref属性引用了名为embark的切入点;切入 点使用<aop:pointcut>元素定义,并配置expression属性选择应用的通知

 

1.1.4 使用模板消除板式代码

Spring旨在通过模板封装来消除样板式代码,案例如下

 

 

1.2 容纳Bean

在基于Spring的应用中,应用对象生存于Spring容器中,由Spring容器创建、装配、配置、管理生命周期;

 

不存在单一的Spring容器,Spring自带集中容器实现,可以归类为(1)Bean工厂,提供基本的DI支持;(2)应用上下文,基于BeanFactory之上构建,提供面向应用的服务。

应用上下文大致分为三种类型:(1)ClassPathXmlApplicationContext,从类路径下的XML配置文件中加载上下文定义,将应用上下文定义文件作为类资源(2)FileSystemXmlapplicationcontext,读取文件系统下的XML配置文件并加载上下文定义(3)XmlWebApplicationContext,读取Web应用下的XML配置文件并装载上下文定义无论文件系统中装载应用上下文还是类路径下装载上下文,将Bean加载到Bean工厂的过程类似;

通过上下文引用,可以调用应用上下文的getBean()方法从Spring容器中获取到Bean。

 

1.2.2 Bean的生命周期

 

 

1.Spring对bean进行实例化;

2.Spring将值和bean的引用注入到bean对应的属性中;

3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;

4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;

5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;

6.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;

7.如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;

8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;

9.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;

10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

 

1.3.1 Spring模块

 

 

核心Spring容器

容器是Spring框架最核心的部分,负责Spring应用中Bean的创建、装配、配置和管理;

 

AOP模块

AOP帮助应用对象解耦合,借助AOP实现将遍布应用的关注点(安全、日志和事务)从所在的对象解耦出来。

 

数据访问和集成

Spring为DAO(data access object)提供了ORM(object-relational mapping);但是Spring没有创建自身ORM解决方案,而是对ORM流行框架进行了集成,如Hibernate、JDO等

 

Web和远程调用

该框架提供了两种形式:(1)面向传统Web应用的基于Servlet的框架(2)面向使用Java Portlet API的基于Portlet的应用

 

Spring Portfolio

整个Spring Portfolio包含多个构建于核心Spring框架之上的框架和类库,即Spring Portfolio为每个领域的Java开发都提供了Spring编程模型。

 

Spring Web Flow,建立于Spring MVC框架之上并为基于流程的会话式Web应用提供支持(象到、购物车);Spring Web Service,提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的;Spring Security,利用AOP为Spring应用提供申明式的安全机制;Spring Integration,提供了集中通用的应用集成模式的Spring申明式风格的实现;Spring Batch,借助Spring强大的面向POJO的编程模型实现大量数据操作;Spring Mobile,支持移动Web开发;Spring Dynamic Modules,整合了Spring的申明依赖注入和OSGi的动态组件模型,使用Spring-DM采取模块化的方式构建应用;Spring .NET,不必放弃依赖注入和AOP实现面向.NET开发;Spring Roo,提供了快速开发Spring应用的交互式工具环境。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值