1. Spring简介
- pring的基础架构起源于2000年早期,它是Rod Johnson在一些成功的商业项目中构建的基础设施
- 2002后期,Rod Johnson发布了《Expert One-on-One J2EE Design and Development》一书
- 2003年2月Spring框架正式成为一个开源项目,并发布于SourceForge中
1.2 Spring工作原理
- Spring是一种用JavaBean配置应用程序的方法
- 运用SpringIOC,通过setter方法来暴露一个类的任何依赖关系(如一个数据库连接),只要在Spring中进行配置来解决依赖性,不用编写一个数据库连接
- 运用Spring AOP 可以解决公共代码重复问题
1.3 Spring框架简介
- Spring框架
- 轻量级
- 容器
- 开源框架
- 用于解决企业应用程序开发复杂性
- 一个轻量级的IOC和AOP容器框架
- 一个解决了许多J2EE开发中常见的问题的强大框架
- Spring框架有7个模块, 每个模块都可以单独存在,或者与其他一个或多个模块联合实现
2. Spring Bean封装机制
- Spring以Bean的方式管理所有的组件,J2EE的全部组件都被视为Bean管理
- Spring负责创建Bean的实例,并管理其生命周期
- Bean在Spring的容器中运行,无须知道Spring容器的存在也可以使用Spring的一些特性
最简单的Spring XML配置文件
<bean>:使用bean标签定义bean管理实体对象
Spring XML文件bean节点常见属性
各个属性的含义:
2.1 BeanFactory
- BeanFactory
- 由org.springframework.beans.factory.BeanFactory接口定义
- BeanFactory是工厂模式(Factory pattern)的实现,负责创建和管理bean
- BeanFactory接口包含以下基本方法
- containsBean(String name)
- getBean(String name)
- getBean(String name,Class class)
- getType(String name)
2.2 ApplicationContext
- ApplicationContext是基于BeanFactory之上的,提供了应用程序框架服务,扩展的新功能如下
- 提供国际化的支持
- 资源访问,如URL和文件
- 事件传递
- 载入多个配置文件等
- 搜索classpath路径,以classpath路径下的applicationContext.xml和bean.xml创建ApplicationContext
- 按照指定路径下的applicationContext.xml和bean.xml创建ApplicationContext
- ApplicationContext接口的重要方法
3. Spring DI/IOC
3.1 什么是Spring的依赖注入
- 依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入
- 实体对象间的依赖关系的演变过程
- 传统方式
- 工厂模式
- 依赖注入
3.2 Spring的设值注入方式
- 设值注入是指通过setter方法传入被调用者的实例
- 被调用者实体对象
MainFrame(主机)类:
Computer(电脑)类:
Display(显示器)类:
- Spring配置文件
- 测试运行
通过bean标签的id属性获取bean对象
3.3 Spring的构造注入方式
- 构造注入是指通过构造方法完成依赖关系的注入
3.4 Spring的自动注入方式
- Spring容器可以自动注入(autowire)相互协作bean之间的关联关系。
- 在<bean/>元素中使用autowire属性指定
- 配置文件
3.5 集合属性
- 配置文件
- 实体类
3.6 Spring注入方式的比较
- 设值注入的优点
- 如果依赖关系(或继承关系)较为复杂 ,设值注入模式往往更为简洁
- 有些地方有其局限性
- 直观,更加自然
- 构造注入的优点
- 构造期即创建一个完整、合法的对象
- 避免了繁琐的setter方法的编写
- 无需担心在调用过程中执行setter方法对组件依赖关系产生破坏
- 在构造函数中决定依赖关系的注入顺序
- 自动注入
- 简化配置文件
4. 基于注解的容器配置
- 注解(Annotation)配置越来越流行
- 2.5版起提供了基于注解配置、装配 Bean 的功能
- @Component 注解配置bean
- @Component注解唯一的一个可选参数是value,用于指定bean的名称(即id值,所以必须是唯一的)
@Repository 数据访问层bean
@Service 业务层bean
@Controller 视图层bean
- 扫描 @Component标注的类
- 使用 @Scope注解配置bean 的作用域
- @Scope定义bean的作用域。
- singleton表示在Spring IoC容器中一个bean定义对应一个对象实例,Spring使用单例模式获取实例
- prototype表示一个bean定义对应多个对象实例,即非单例模式,常称作多例。
- 使用 @Autowired注解
- 可以对类成员变量、方法及构造函数进行标注,以完成自动装配依赖的工作
- 多个bean导致的创建bean失败的问题
- 把属性名称做为依赖bean名称
- @Qualifier 注解明确指定依赖bean的名称
- 首先根据属性的类型在Spring 应用容器中查找类型匹配的bean
- 如果没有类型匹配的bean,抛出BeanCreationException;如果只有一个,则注入依赖,完成自动装配;如果不只一个,则继续执行步骤3;
- 如果通过 @Qualifier指定了bean 名称,则从所有符合类型的bean中返回指定的bean,完成自动装配;如果没有通过 @Qualifier制定bean 名称,则通过反射技术获取当前属性的名称作为bean 名称返回指定的bean,完成自动装配;
使用JSR-250 规范定义的注解
- 使用 @Resource 注解注入依赖
- @Autowired 默认按 byType 自动注入
- @Resource 默认按 byName 自动注入
- @PostConstruct 和 @PreDestroy
- @PostConstruct 注解的方法将在类实例化后调用
- @PreDestroy注解的方法将在类销毁之前调用
- ConfigurableApplicationContext close方法
总结
- Spring的工作原理
- BeanFactory接口的应用
- applicationContent对Bean的管理
- Spring依赖注入
- 设值注入
- 构造注入
- 自动注入
- 基于注解注入