Java Spring

本文是对《Spring实战》第四版的总结,探讨了Spring的核心概念,如依赖注入(DI)、面向切面编程(AOP)和模板封装。DI通过应用上下文实现对象间的松耦合,AOP用于模块化横切关注点,减少核心业务逻辑与辅助功能的耦合。此外,还介绍了Spring的自动装配和显示装配机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这篇博客主要是对《Spring实战》(第四版)一书的整理。

Spring实战电子书:Spring 实战(第 4 版) - Spring 实战(第四版)

第五版链接:Spring 实战(第 5 版) - Spring 实战(第五版)

吐槽:现在国内Spring实战出到了第五版,买完看了下跟第四版内容组织差别不小。

建议初学者还是先看第四版,第四版开宗明义介绍了Spring的各个概念,个人觉得对于入门帮助更大一些。

Spring核心

POJO:Plain Ordinary Java Object,可以理解为普通实体类,不需要考虑业务逻辑,单纯映射数据表,包含getter、setter方法等。

DI:Dependency Injection,依赖注入。

AOP:Aspect-Oriented Programming,面向切面编程。

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

  • 基于 POJO 的轻量级和最小侵入性编程;

  • 通过依赖注入和面向接口实现松耦合;

  • 基于切面和惯例进行声明式编程;

  • 通过切面和模板减少样板式代码。

依赖注入

依赖注入会将所依赖的关系自动传递给对象,而不是让对象自己去获取依赖。

举例而言,

package sia.knights;
  
public class BraveKnight implements Knight {
  private Quest quest; // Quest为一个接口
  public BraveKnight(Quest quest) {
    this.quest = quest;
  }
  public void embarkOnQuest() {
    quest.embark();
  }
}

 通过接口Quest而非特定的支持Quest接口的类class1,可以同时传进去class1,class2等等,达到了松耦合的效果。

通过XML或者Java Configuration可以实现依赖注入的效果。

Spring通过应用上下文(application context)来装载bean的定义并把他们组装起来。

应用切面

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

为了防止侵入过多,可以通过切面的方式实现日志打印、事务管理、安全等功能。

在整个系统内,关注点的调用通常散步到各个模块中,而这些功能实际上并不是重点。

 AOP 能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP 能够确保 POJO 的简单性。

如下图所示,我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助 AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

 可以通过XML配置来实现切面,具体如何实现参考1.3应用切面一节。

模板封装

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

消除样板式代码可以极大程度简化企业级Java开发

装配Bean

Spring提供了三种主要的装配机制:

  • 在 XML 中进行显式配置。

  • 在 Java 中进行显式配置。

  • 隐式的 bean 发现机制和自动装配。

毫无疑问,自动装配是最方便的,目前大部分时候都使用自动装配的方法。

自动化装配

Spring 从两个角度来实现自动化装配:

  • 组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 bean。

  • 自动装配(autowiring):Spring 自动满足 bean 之间的依赖。

自动化装配核心:

通过@component注解进行声明,这个简单的注解表明该类会作为组件类,并告知 Spring 要为这个类创建 bean。

@componentScan会对组件进行扫描。

@Componet("lonelyHeartsClub")可以为一个组件设置独有的id,方便为了满足多态的依赖注入环节能使用接口指代特定的bean。

使用@autowired在其他类里声明即可自动调用这个类的bean。

值得特别注意的是:在一个框架里,同一类型的bean一般只有一个,不会出现多个。

@autowired搭配@qualifier可实现启动特定id的bean。

@autowired
@qualifier("hello")
interface Interface

Spring自动装配时如果有多个可能的值的话会直接报异常。

显示装配

当想要将第三方库中的组件装配到你的应用中时,在这种情况下,是没有办法在它的类上添加 @Component 和 @Autowired 注解的,因此就不能使用自动化装配的方案了。

这时候可以使用Java或者XML进行显示配置。

面向切面的Spring

  • 面向切面编程的基本原理

  • 通过 POJO 创建切面

  • 使用 @AspectJ 注解

  • 为 AspectJ 切面注入依赖

切面能帮助我们模块化横切关注点。简而言之,横切关注点可以被描述为影响应用多处的功能。例如,安全就是一个横切关注点,应用中的许多方法都会涉及到安全规则。图 4.1 直观呈现了横切关注点的概念。

每个模块的核心功能都是为特定业务领域提供服务,但是这些模块都需要类似的辅助功能,例如安全和事务管理。 

如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或委托(delegation)。但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系;而使用委托可能需要对委托对象进行复杂的调用。

切面提供了取代继承和委托的另一种可选方案,而且在很多场景下更清晰简洁。我们仍然在一个地方定义通用功能,但是可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类。

AOP参考链接:

Spring实战第四章

AOP的基本认识 - Slive - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值