《Spring 实战》笔记

第一部分 Spring的核心

第一章 Spring 之旅

1.0 本章内容

  • Spring的bean容器
  • 介绍Spring的核心模块
  • 更为强大的Spring生态系统
  • Spring的新功能

1.1 简化Java开发

Spring采用了以下4种关键策略降低Java开发的复杂性:

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

激发POJO的潜能

在基于Spring构建的应用中,通常没有任何痕迹表明你使用了Spring,最坏的场景是,在一个类中或许会使用Spring注解,但它依然是POJO。Spring的非入侵编程模型意味着某个类在Spring应用和非Spring应用中都可以发挥同样的作用。尽管形式上看起来很简单,但POJO一样可以具有魔力,Spring赋予POJO魔力的方式之一就是通过DI(Dependency Injection,DI)来装配它们。

依赖注入

任何一个有实际意义的应用都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。

耦合具有两面性。一方面,紧密耦合的代码难以测试、难以复用、难以理解,并会典型地表现出“打地鼠”式的BUG特性(修复一个BUG,将会出现一个或者更多新的BUG)。另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合式必须的,但应当被小心谨慎地管理。

通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,如图1.1所示,依赖关系将被自动注入到需要它们的对象当中去。

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

应用切面

DI能够让相互协作的软件组件保持松耦合,而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。

面向切面编程往往被定义为促使软件系统实现关注点分离的一项技术。系统由许多不同的组件组成,每个组件负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。

如果将这些关注点分散到多个组件中,你的代码将会带来双重的复杂性。

  • 实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关代码。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中。

  • 组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址,而不应该关注它是不是安全的或者是不是需要支持事务。

图1.2展示了这种复杂性。左边的业务对象与系统级服务结合的过于紧密。每个对象不但要知道它需要记日志、进行安全控制和参与事务,还要亲自执行这些 服务。

AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。总之,AOP能够确保POJO的简单性。如图1.3所示,我们可以把切面想象为覆盖在很多组件之上的一个外壳,应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活的应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

使用模版消除样板式代码

样板式代码的一个常见范例是使用JDBC访问数据库查询数据,但JDBC并不是产生样板式代码的唯一场景。在许多编程场景中往往都会导致类似的样板代码,JMS、JNDI和使用Rest服务用场也涉及大量的重复代码。

Spring旨在通过模版封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板式代码成为了可能。

1.2 容纳你的Bean

 

1.3 俯瞰Spring风景线

1.4 Spring的新功能

1.5 小结

现在,你应该对Spring的功能特性有了一个清晰的认识。Spring致力于简化企业级Java开发,促进代码的松耦合。成功的关键在于依赖注入和AOP。

在本章,我们先体验了Spring的DI,DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。不同于自己获取依赖对象,对象会在运行期赋予它们所依赖的对象。依赖对象通常会通过接口了解所注入的对象,这样的话就能确保底耦合。

除了DI,我们还简单介绍了Spring对AOP的支持。AOP可以帮助应用将散落在各处的逻辑汇集于一处——切面。当Spring装配bean的时候,这些切面能够在运行期编织起来,这样就能非常有效地赋予bean新的行为。

依赖注入和AOP是Spring框架最核心的部分,因此只有理解了如何应用Spring最关键的功能,你才有能力使用Spring框架的其他功能。在本章,我们只是触及了Spring DI和AOP特性的皮毛。在以后的几章,我们将深入探讨DI和AOP。

闲言少叙,我们立即转到第二章学习如何在Spring中使用DI装配对象。

第二章 装配Bean

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值