Spring In Action 第一章

参考博客:http://tantanit.com/springinaction-di-si-ban-di-yi-zhang-jiang-spring-fu-zhu-shi-jian-du-shu-bi-ji-yi/

《Spring in Action》第四版第一章《将 Spring 付诸实践》读书笔记(一)

Spring 做了很多事,但是 Spring 最重要的是以下两个特性:
1.依赖注入(dependency injection),简称 DI
2.面向方面编程(aspect-oriented programming),简称 AOP
这两个特性有着共同的编程思想,就是每个模块或类都专注于自己做的事,尽量做到松耦合,高内聚,尽可能可重用。依赖注入是在实例管理上做到这一点,而面向方面编程是在业务逻辑上做到这一点。

#依赖注入
在处理类与类之间的引用上发挥作用。什么是依赖?类 A 要使用类 B,我们就说类 A 依赖类 B,从编程语言的角度,
其实就是引用类 B 的实例。注入的意思就是,在类 A 外生成类 B 的实例,类 A 直接引用该实例,把主被动态一改,就是将类 B 的实例注入到类 A 中。如果不使用依赖注入,类 A 需要自己维护对 B 的直接引用
(必须是具体的类型而不能是抽象类或接口),
也就是要自己初始化一个 B 的实例。这导致了高度耦合,难以测试。

#装配
将应用组件关联起来的动作叫做装配(wiring)。可以使用 XML 的方式进行配置,也可以使用 Java 代码。(个人觉得 Java 的方式更加可读和可维护,这里只记录 java 方式。)

@Configuration
public class KnightConfig {
  @Bean
  public Knight knight() {
    return new BraveKnight(quest());
  }
  @Bean
  public Quest quest() {
    return new SlayDragonQuest(System.out);
  }
}

这个配置文件为 Knight 和 Quest 接口创建了实例,并且将 Quest 的实例注入到 Knight 中。也可以说是把 Quest 装配到 Knight 中(Quest 还可以继续装配到其它 bean 里)。但是它们是如何加载,又加载到哪里呢?答案是,应用程序的 bean 是在 Spring 容器中。将这两个 bean 注册到应用上下文后,通过应用上下文可以获取到这些 bean。

#Spring 容器
是 Spring 框架的核心,Spring 容器使用框架来管理应用程序的组件,包括创建组件直接的关联。不存在单一的 Spring 容器,Spring 容器是由可分为两类的一些容器构成。bean 工厂(Bean factories,由 org.springframework.beans.factory.BeanFactory 接口定义)是最简单的容器,为依赖注入提供基础的支持。应用上下文(Application contexts,
由 org.springframework.context.ApplicationContext 接口定义),是一个提供了应用框架层级服务的 bean 工厂。这些服务包括:从属性文件解析文本,将应用的事件发布到相应的事件监听器等。对于大部分应用来说,bean 工厂的级别太低,能做的事太少,所以偏好使用应用上下文。

#Spring 偏好使用应用上下文,以下是主要的上下文:
1.AnnotationConfigApplicationContext,从一个或多个 Java 配置文件中加载 Spring 应用上下文。
2.AnnotationConfigWebApplicationContext,从一个或多个 Java 配置文件中加载 Spring web 应用上下文。
3.ClassPathXmlApplicationContext,从 classpath 目录下的一个或多个 xml 配置文件中加载上下文定义,并且将上下文定义看作 classpath 的资源。
?FileSystemXmlApplicationContext,从文件系统下的一个或多个 xml 配置文件中加载上下文定义。
4.XmlWebApplicationContext,从 web 应用程序中的一个或多个 xml 配置文件中加载上下文定义。

5.AnnotationConfigWebApplicationContext 和 ApplicationContext 涉及 Spring web 的内容将在第八章展开,先看 FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 这两个使用 xml 加载上下文的例子。这两种方式和从 bean 工厂加载 bean 相似。

// 使用 FileSystemXmlApplicationContext 加载 applicationContext
ApplicationContext context = new FileSystemXmlApplicationContext("c:/knight.xml");

// 使用 ClassPathXmlApplicationContext 加载 applicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

#两种方式的区别在于:
FileSystemXmlApplicationContext 在文件系统里的特定位置查找 xml 配置文件,而 ClassPathXmlApplicationContext 在 classpathl 里(包括 jar 里)的任何地方查找 xml 配置文件。

#bean 的生命周期

(笔者再说说平时编程时感受到的,依赖注入的一些好处。由于 Spring 容器将所有的实例统一管理,类 A 在使用类 B 时,只需要声明对类 B 的引用,就可以直接从 Spring 容器里获取 B 的实例,不用再重新生成一个 B 的实例。假定实例范围定义为全局唯一,如果 A2 也使用类 B,也只需要声明对类 B 的引用,获取同一个实例,依赖注入可以减少重复实例化,避免重复生成实例的开销。依赖注入更大的好处体现在引用具有传递性时,比如类 A 使用类 B,而类 B 又使用类 C。因为从功能上看,类其实是方法的集合,类 A 可能只使用类 B 的一个方法,而这个方法并未使用类 C。那么实际上在业务和功能上,类 A 只需要和类 B 耦合,根本不使用类 C。如果没有使用依赖注入,如果类 A 要使用类 B,需要显式地实例化 B,而要实例化 B,又要先实例化 C,特别是在 C 的构造函数带有参数时,过程令人抓狂。由于各个类之间的引用情况可能非常复杂,引用链可能很长,这个过程会非常痛苦。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值