一、Spring 之旅
Spring 功能底层依赖两个核心特性:依赖注入(DI)和面向切面编程(AOP)。DI 让相互协作的软件组件保持松散耦合,AOP 允许你把遍布应用各处的功能分离出来形成可重用的组件。
Spring 的使命是简化 Java 开发,促进代码的松散耦合。为降低 Java 开发的复杂性,Spring 采取以下 4 种关键策略:
- 基于 POJO 的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例记性声明式编程;
- 通过切面和模板减少样板式代码。
耦合的两面性:
- 紧密耦合的代码难测试,难复用,难理解,表现出打地鼠式的bug特性;
- eg:构造函数中 new 依赖对象
- 另一方面,一定程度的耦合又是必须的。
- eg:构造函数中传入依赖对象,依赖对象由框架生成实例。
什么是装配?
- 创建应用组件之间协作的行为。
Spring 如何工作?
- 通过应用上下文装载 bean 的定义并把它们组装起来。
- Spring 应用上下文全权负责对象的创建和组装。
AOP 的定义:
- 为促使软件系统实现关注点分离的一项技术。系统由不同组件组成,每个组件负责特定功能。除了核心功能职位,有些组件还经常承担额外职责。比如日志,事务管理和安全的系统服务经常融入到自身具有核心业务逻辑的组件中,这些系统服务通常被称为横向关注点,因为他们会跨越系统的多个组件。
关注点分散到多个组件中,代码会带来双重复杂性:
- 代码重复出现在多组件中。不易维护。
- 核心业务逻辑代码混乱。掺杂与业务不相关的内容。
Spring 容器的职责:
- 在基于 Spring 的应用中,你的应用对象生存于 Spring 容器中。
- Spring 容器负责创建对象,装配对象,配置对象并管理对象的整个生命周期。
- Spring 自带多个容器实现:bean 工厂(低级,不推荐) 和 应用上下文(高级,推荐)。
常用的 Spring 应用上下文:
- AnnotationConfigApplicationContext:Java 配置类
- AnnotationConfigWebApplicationContext:Java 配置类加载 Spring web 应用上下文
- ClassPathXmlApplicationContext:类路径下的 xml 文件
- FileSystemXmlApplicationContext:文件系统的 xml 文件
- XmlWebApplicationContext:web 应用下 xml 文件
bean 装载到 Spring 应用上下文中的典型生命周期过程(p20):
具体步骤:
- bean 实例化
- bean 引用注入到 bean 属性
- beanID 传递
- bean 工厂容器实例传入
- bean 应用上下文引用传入
- bean 后置处理器预初始化处理
- bean 初始化接口的方式实现调用
- bean 后置处理器初始化后处理
- bean可被应用使用,驻留在应用上下文中。
- bean 被销毁接口调用。
Spring 模块:
- Spring 核心容器
- Spring AOP
- 数据方式与集成:ORM,JMS
- Web 与远程调用:MVC,RMI,HTTP Invoker
- Instrument:agent(不是重点)
- 测试
【Spring Portfolio】
定位:构建于核心 Spring 框架之上的框架和类库。为每个领域的 Java 开发提供 Spring 编程模型。
举例:
- Spring Web Flow
- Spring Web Service(不介绍)
- Spring Security
- Spring Integration:与其他应用交互,提供多种通用引用集成模式的 Spring 声明式风格实现。
- Spring Batch:对数据进行大量操作。本书不涉及。推荐《Spring Batch in action》
- Spring Data:方便使用任何数据库。
- Spring Social:社交网络扩展模块。关注连接,而不是社交。本书不涉及。
- Spring Mobile:移动应用是另一个引人瞩目的软件开发领域。Spring MVC 的扩展模块。
- Spring for Android:本书不涉及。
- Spring Boot:极简编程。
二、装配 Bean
声明bean;
构造器注入和 setter 方法注入
装配 bean;
控制 bean 的创建和销毁。
Spring 中装配 bean 的三种主要方式:自动化配置,基于 Java 的显式配置以及基于 XML 的显式配置。推荐使用顺序优先级递减。
【自动化配置】
Spring 从两个角度实现:组件扫描(发现应用上下文的 bean),自动装配(建立 bean 依赖)。
组件扫描:
- JavaConfig:注解 @ComponentScan
- XmlConfig:元素
bean 命名:
- @Component
- @Named(不常用)
自动装配:
- @Autowired 作用到属性或构造器或属性setter方法或类方法
- @Inject 为 Java 注解,大多数场景可与 @Autowired 互换。
【Java 显式配置】
- 创建配置类:注解 @Configuration