[译] 细谈依赖和配置

依赖项的详细配置 正如前面所提到的那样,你可以定义 bean 的属性和构造函数参数,去引用其他已经设置好的 bean 或者内联定义的值。 为了达到这个目的,Spring 的基于 XML 配置元数据支持在 和 元素内增加子元素。 直接值(基本类型,字符串等等) 元素的 value 值,把一个属性值或者构造函数参数定义为一个可读字符串。Spring 的转换服务被用来将这些值从字符串转换为属性或者参数的实际类型。下面的例子展示了可以被设置的多种值: <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- results in a setDriverClassName(String) call --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="misterkaoli"/> </bean> 下面的例子使用 p-namespace 来让 XML 配置更加简明: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/mydb" p:username="root" p:password="misterkaoli"/> </beans> 上面的 XML 更加的简明。然而,类型是在运行时而不是设计时发现的,除非你在创建 bean 定义的时候,用支持自动属性完成的 IDE(例如 Intellij IDEA 或者 Eclipse 的 Spring 工具)。这些辅助都是高度推荐的。 你同样可以配置 java....

2023-09-11 653 words 4 min

[译] 依赖注入

在依赖注入(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

[译] 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

[译] 容器概述

容器概述 org.springframework.context.ApplicationContext 接口代表了 Spring IoC 容器,它主要负责通过读取配置文件对 bean 进行实例化、配置和组装。 容器通过读取配置元数据来获知要实例化、配置和组装那些对象。配置的元数据一般为 XML、Java 注解和 Java 代码的形式,它让你能够表达组成你应用程序的对象以及对象之间的丰富的相互依赖关系。 Spring 提供了 ApplicationContext 接口的若干实现。在单体应用中,创建一个 ClassPathXmlApplicationContext 或者 FileSystemXmlApplicationContext 是很常见的。虽然 XML 是定义配置元数据的传统形式,但是你还可以通过在 XML 文件里面进行声明配置来告诉容器对于 Java 注解或者Java代码格式的支持。 在大多数的应用场景中,并不需要显式的代码来实例化 Spring IoC 容器。例如,在 Web 应用的场景中,在 web.xml 文件中仅用简单的 8 行代码左右的样板 Web XML 描述符即可满足需要(参考 Convenient ApplicationContext Instantiation for Web Applications)。如果你使 Eclipse 中的 Spring 工具(在 Eclipse 开发环境中),你可以通过几下鼠标点击或者按键的敲击就能轻松创建这样一个样板配置文件。 下图展示了关于 Spring 工作机制的一个全局视角。在 ApplicationContext 被创建和初始化后,你的应用类和配置元数据已经捆绑在一起了,这样一来,你就有一个充分配置并且可执行的系统或者应用程序。 配置元数据 如上图所示,Spring Ioc 容器接收到一种格式的配置元数据。这个配置元数据代表了,作为一个应用开发者你告诉 Spring 容器在应用程序中,如何实例化、配置和组装对象。 传统的配置元数据是一种简单并且符合直觉的 XML 形式,在本章的大部分地方,也用此来表达关键的概念和 Spring IoC 容器的特性。 基于 XML 的元数据不是配置元数据的唯一允许的形式。Spring IoC 容器自身与配置元数据实际上是什么格式完全解耦。目前许多开发者在应用程序中选择基于Java 的配置。...

2023-09-02 572 words 3 min