[译] 依赖注入

在依赖注入(DI)里,对象通过构造函数参数、工厂方法参数或者在 被工厂方法创建返回的对象中设置的属性定义他们的依赖。然后,容器在创建这些 bean 时,注入依赖。这个过程与 bean 自身使用所需要类的直接构造函数实例化,或者通过 Service Locator 模式来找到所需要的依赖这个过程正好相反。 使用 DI 原则的代码更加干净整洁,并且提供给对象的依赖时,解耦也更加高效。对象并不找他们的依赖也并不知道这些依赖的地址或者类。这样的结果就是,你的类变得更易测试,尤其是当依赖是接口或者抽象的父类时,在单元测试可以对这些依赖进行打桩或者mock他们的实现。 基于构造函数的依赖注入 基于构造函数的依赖注入,是通过容器调用构造函数,并且传入若干参数来实现的,每一个参数都代表了一个依赖。调用静态工厂方法并传入特定的参数来构造一个 bean 也是一样的,在本讨论中,对待构造函数的参数和静态方法的参数也是相似的。下面的这里展示了一个之能通过构造函数来进行依赖注入的类: public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private final MovieFinder movieFinder; // a constructor so that the Spring container can inject a MovieFinder public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // business logic that actually uses the injected MovieFinder is omitted... } 注意,对于这个类没有更多特殊的地方。它仅仅是一个POJO,并且对容器特定接口、父类或者注解没有任何依赖。【译者按:没有任何代码侵入性】 构造函数参数解析 构造函数参数解析匹配通过参数类型来进行。如果在构造函数参数的 bean 定义中没有歧义,那么在 bean 定义中构造函数参数的顺序,就是当 bean 被实例化时,传给给构造函数参数的顺序。考虑下面的类:...

2023-09-11 768 words 4 min

中秋绝句

中秋绝句 癸卯秋夜,虽炎热潮湿,开窗无月,然心情大好,咏志抒怀,无碍也,是为序。 自来霜雪映吴钩,半生浮云半生幽 未有三旬寂寞守,何能一夜照清秋

2023-09-06 4 words 1 min

[译] Spring AOP 概念

AOP 通过提供另外一种关于程序结构的思考方式补充了面向对象编程(OOP )。在 OOP 中模块的关键单元是 class,而在 AOP 中,模块的关键是 Aspect(切面)。切面支持跨多个对象和类型的关注点模块化(比如事务的管理)。在 AOP 中这种关注点通常被叫做 “跨领域” 关注点。 Spring 的一个核心组件就是 AOP 框架。虽然 Spring IoC 容器并不依赖于 AOP(意思是如果不想用 AOP 可以不用),但是 AOP 对 Spring IoC 做了一个补充,提供了一种功能非常强大的中间件解决方案。 Spring AOP 和 切面切点 Spring 提供了简单而高效的方式来自定义切面,可以通过基于 schema 的方法也可以通过 @AspectJ 注解的风格。当使用 Spring AOP 来织入时,这两种风格都提供了充分类型的 advice 和 AspectJ 的切点语言。 这张主要讨论 schema 和 @Aspect 的 AOP 支持。AOP 底层的支持在下面的一章节会讨论到。 AOP 在 Spring 框架中的用途: 提供声明式的企业级服务。最重要的就是声明式事务管理 让用户实现自定义的切面作为他们用 AOP 实现 OOP 的补充。 Note:如果你对通用的声明式服务或者其他预先打包的声明式中间件服务感兴趣,你不用直接和 Spring AOP 直接打交道,可以跳过本章的大部分地方。 AOP 概念 让我们从一些核心的 AOP 概念和术语出发。这些术语并不只是 Spring 特有的。不幸地是,AOP 术语并不符合直觉。然而,如果 Spring 使用它自己的术语,或许会更加令人迷惑。...

2023-09-05 1369 words 7 min

[译] Bean 概述

一个 Sring IoC 容器可以操作一个或者多个 bean。这些 bean 是通过你提供给容器的配置元数据生成的(例如,以 XML 中的 <bean/> )。 在容器内,这些 bean 的定义被表示成 BeanDefinition 对象的形式,包含了下面的元数据: 包定义的类名:通常是定义的 bean 的真正实现类 bean 行为配置元素,表明了 bean 在 container 中的行为(scope,生命周期回调等等)。 对其他需要的 bean 的引用。这些引用也被称作协作器和依赖。 在一个新创建的对象中的其他配置设置 - 例如,池的数量限制或者一个操作连接池 bean 中的连接数量 这些元数据转换为构成这些 bean 定义的一系列属性。下表表示了这些属性值: 属性 含义 Class 正在实例化的bean Name bean的名字 Scope Bean的Scope 构造函数参数 依赖注入 自动装配模式 装配的协作对象 懒加载模式 懒加载 Bean 初始化方法 初始化回调 析构方法 析构回调 除了包含怎么创建一个特定的 bean 的信息之外, ApplicationContext 的实现同样允许在容器外面已经创建好的对象注册到其中(用户创建)。这是通过 getBeanFactory 方法获取到 ApplicationContext 的 BeanFactory,得到 DefaultListableBeanFactory 实现来做到的。DefaultListableBeanFactory 支持通过调用 registerSingleton(..) 和 registerBeanDefinition(....

2023-09-02 559 words 3 min

[译] Spring IOC 容器

Spring IOC 和 bean 的简介 本章涵盖了 SpringFramework 中的控制反转原则(Ioc)的实现。IoC 也被称为依赖注入(DI)。它是这样的一种过程,在此期间对象仅通过构造函数参数、工厂方法的参数或者当对象实例被构造后或者通过工厂方法返回时在它上面设置的属性定义自己的依赖(即对象必须合作的其他对象)。 当容器创建这些 bean 后,再注入这些依赖。 这个过程本质上与bean 通过使用直接的类构造函数进行直接实例化或者通过类似 Service Locator模式来寻找依赖的位置是相反的(这也是 IoC 名字的由来)。 org.springframework.beans 和 org.springframework.context 包是 SpringFramework IoC 容器的基石。BeanFactory 接口提供了一种更先进的能够控制人已类型对象的配置机制。ApplicationContext 是 BeanFactory 的子接口。它增加了下面的特性: 与 Spring 的 AOP 特性更容易整合 消息资源处理(在国际化场景的使用) 事件发布 例如用于 Web 应用的 WebApplicationContext 应用层特定的上下文 总而言之,BeanFactory 提供了配置的框架和基本的功能。ApplicationContext 增加了更多的企业特定的功能。ApplicationContext 完全是 BeanFactory 的超集。在本章关于 Spring IoC 容器做专门描述时会用到。想要获取更多的关于使用 ApplicationContext 而非 BeanFactory 的信息,参见介绍 BeanFactory API 的部分。 在 Spring 中,作为你应用基石同时可以被 Spring IoC 容器所操控的对象就被称之为 bean。bean 就是被 Spring IoC 容器实例化、组装和设置的对象。否则,一个 bean 就是你应用程序中诸多对象中的一个。 Beans 以及他们依赖关系,反映在容器使用的配置元数据中。

2023-09-02 72 words 1 min