Spring概览
- Spring的使命: 简化java开发
关键策略:
- 基于POJO的轻量级和最小侵入型编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模版减少样板式代码
依赖注入:
传统的代码,让每个对象自己负责管理与之相互协作的对象的引用,将会导致高度耦合及难以测试
public class BraveKnight implements Knight{ // 骑士对象,拥有寻求少女的任务 private DameselQuest quest; public Knight() { this.quest = new DameselQuest(); // 与DameselRuest紧耦合 } public void embarkQuest() { quest.embark(); // 执行quest } }
通过依赖注入,对象有Spring进行管理,无需自行创建以及管理
构造器注入
public class BraveKnight implements Knight{ // 骑士对象,拥有寻求少女的任务 private DameselQuest quest; public Knight(Quest quest) { // quest被注入进来,且为Quest接口 this.quest = quest; } public void embarkQuest() { quest.embark(); // 执行quest } }
通过接口引用对象,可以实现不同的任务
- 实现了松耦合,可以使用不同的具体实现来进行替换
Spring配置文件注入
<bean id="knight" class="com.eric.example.BraveKnight"> <constructor-arg ref="quest"/> <!-- 注入Quest Bean --> </bean> <bean id="quest" class="com.eric.example.SimpleQuest"></bean>
工作原理
- Spring通过应用上下文(Application Context)装载Bean的定义并且进行组装
- 通过xml配置: 选择
ClassPathXmlApplicationContext
作为上下文较合适
public class Test { public static void main(String[] args) { // 加载Spring上下文 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 获取bean BraveKnight knight = ac.getBean('kinght'); } }
面向切面编程
- 将遍布应用各处的功能分离出来形成可重用的组件,例如日志、事务管理和安全
- AOP能够时公共服务模块化,以声明的方式将其应用到需要的组件中
- 声明公共服务Bean
- 在配置文件中,定义需要的组件的切点
- 配置声明的通知位置
Spring容器
- 负责对象的创建,装配,配置以及生命周期的管理
- bean工厂
- 是最简单的容器,提供基本的依赖注入支持
- 应用上下文
- 基于BeanFactory创建,提供应用框架级别的服务
bean工厂相对低级,侧重于使用应用上下文
应用上下文的使用:
AnnotationConfigApplicationContext
: 从基于java的配置类中加载Spring应用AnnotationConfigWebApplicationContext
: 从基于java的配置类中加载SpringWeb应用上下文ClassPathXmlApplicationContext
: 从类路径下的XML配置文件加载上下文定义,将定义文件作为类资源FileSystemXmlApplicationContext
: 从文件系统下的XML配置文件中加载上下文定义XmlWebApplicationContext
: 从Web应用下的XML配置文件汇总加载上下文定义
bean的生命周期
- Spring模块
- Spring核心容器
- 管理bean的创建、配置和管理
- 包括Spring bean工厂,提供依赖注入的功能
- 基于bean工厂的多种Spring应用上下文的实现
- AOP模块
- 开发切面的基础
- 帮助应用对象解耦
- 数据库访问和集成
- JDBC和DAO模块抽象了JDBC的样板式代码
- ORM模块,建立在对DAO的支持上,提供更为简便的DAO构建方式,对许多ORM框架进行集成(Hibernate, Mybatis)
- Web与远程调用
- 通过MVC模式构建Web应用
- Instrumentation
- 为JVM提供代理的功能
- 测试
- 致力于Spring应用的测试
- Spring核心容器