一、IoC概念及原理
- IoC是什么:
- Inversion of Control(控制反转),一种软件设计原则
- IoC的作用:
- 把对象创建和对象之间的调用过程,交给Spring进行管理,降低软件组件之间的耦合度
- 特点:
- 在IOC容器里,组件不再负责主动创建或获取依赖的实例,而是通过容器被动地接收依赖
- 结果:组件只需关注自己的业务逻辑,将对象的创建和生命周期等细节交给IOC容器处理
- 在IOC容器里,组件不再负责主动创建或获取依赖的实例,而是通过容器被动地接收依赖
- 实现的两种方式:
- 依赖注入(Dependency Injection:DI)
- 依赖查找(Dependency Lookup)
- IoC底层原理:(两个核心概念)
- 依赖注入(DI)
- 通过注入依赖对象来实现控制反转
- 容器负责创建和管理组件,并将所需的依赖对象通过构造函数、属性注入或方法注入等方式注入到组件中
- 实现方式:(如何传递依赖对象)
- 构造函数注入
- 属性注入
- 方法注入
- 反射(Reflection)
- 一种在运行时动态获取和操作对象的能力
- 帮助IOC容器在运行时动态地创建和操作对象,实现依赖注入的过程
- 使用方式:
- 获取类的信息(通过Class对象)
- 创建对象实例(通过构造函数)
- 设置属性值(通过属性的set方法)
- 调用方法(通过方法的invoke方法)
- 依赖注入(DI)
二、IoC接口(BeanFactory)
- BeanFactory接口
- 定义了获取组件实例的基本方法
- 提供的方法:
- getBean:获取组件对应的实例对象
- containsBean:判断容器里是否包含指定名称的组件
- isSingleton:判断指定名称的组件是否为单例
- ApplicationContext接口
- 继承自BeanFactory接口,所以除了BeanFactory接口提供的基本功能,还有很多高级功能(国际化、事件处理、资源加载)
- 提供的方法:
- getMessage:获取国际化信息
- publishEvent:发布事件
- BeanPostProcessor接口
- 一个后置处理器接口,用于在容器实例化和依赖注入过程中对组件进行额外的处理操作
- 提供的方法:
- postProcessBeforeInitialization:在组件初始化之前进行处理
- postProcessAfterInitialization:在组件初始化之后进行处理
三、IOC操作Bean管理
- Spring里有两种bean
- 普通bean
- 特点:在配置文件中的定义bean类型就是返回类型
- 工厂bean(FactoryBean)
- 特点:在配置文件中的定义bean类型可以和返回类型不一样
- 创建方式
- 首先创建类(作为工厂bean,实现接口FactoryBean)
- 实现接口里面的方法,在实现的方法中定义返回的bean类型
- 创建方式
- 特点:在配置文件中的定义bean类型可以和返回类型不一样
- 普通bean
- bean作用域
- 默认情况下,bean为单实例对象
- 设置单实例、多实例
- 设置bean标签里的scope属性
- 属性值
- 默认值:singleton(单实例对象)
- 特点:在加载spring配置文件时就会创建单实例对象
- prototype(多实例对象)
- 特点:在调用getBean方法时创建一个多实例对象
- 默认值:singleton(单实例对象)
- 属性值
- 设置bean标签里的scope属性
- bean的生命周期
- 定义
- 从对象创建到销毁的过程
- 具体过程
- 通过构造器创建bean实例(无参数构造)
- 为bean的属性设置值和对其他bean引用(调用set方法)
- 调用bean的初始化方法(需要进行配置初始化的方法)
- bean可用
- 容器关闭时,bean被销毁(需要进行配置销毁的方法)
- 定义
- Bean管理:
- 即两个操作:
- Spring创建对象
- Spring注入属性
- 即两个操作:
- Bean管理操作:
- 第一种方式:基于xml配置文件
- 手动管理
- 基于xml方式创建对象
- spring配置文件里,使用bean标签,配置属性,实现对象的创建
- 属性
- id:获取的对象其唯一标识
- class:包类路径(类全路径)
- 属性
- 特点:
- 创建对象时,默认也是执行无参的构造方法完成对象的创建
- spring配置文件里,使用bean标签,配置属性,实现对象的创建
- 基于xml方式注入属性
- 依赖注入(DI)
- 第一种注入方式:使用set方法
- 创建属性及属性对应的set方法
- spring配置文件里创建对象,注入属性(bean+property)
- 第二种注入方式:使用有参数构造进行注入
- 创建类,定义属性,创建有参数的构造方法
- spring配置文件里有参数构造注入属性
- 第一种注入方式:使用set方法
- 注入其他类型属性
- 属性值包含特殊符号 - 使用转义 / (value标签里)
- 注入集合属性
- 数组类型、List集合类型、Map集合类型
- 注入属性
- 外部bean
- 内部bean和级联赋值
- 依赖注入(DI)
- 基于xml方式创建对象
- 自动装配
- 是什么:
- 根据指定装配规则(属性名称或属性类型),Spring自动将匹配的属性值进行注入
- 装配流程:
- 根据属性名称自动注入
- 根据属性类型自动注入
- 是什么:
- 通过外部属性文件管理XML
- 直接配置数据库信息
- 配置德鲁伊连接池
- 引入德鲁伊连接池依赖jar包
- 引入外部属性文件配置数据库连接池
- 创建外部属性文件,properties格式文件,写数据库信息
- 把外部properties属性文件引入到spring配置文件中
- 引入context名称空间
- 在spring配置文件使用标签引入外部属性文件
- 直接配置数据库信息
- 手动管理
- 第二种方式:基于注解方式
- 注解:
- 注解是什么:
- 代码特殊标记
- 格式:@注解名称(属性名称=属性值,属性名称=属性值)
- 代码特殊标记
- 使用注解
- 注解作用在类上面,方法上面,属性上面
- 使用注解目的:
- 简化xml配置
- 注解是什么:
- Spring针对Bean管理中创建对象提供注释(下面四个注解功能一样,都能用来创建Bean实例)
- @Component
- @Service
- @Controller
- @Repository
- 基于注解方式实现对象创建
- 第一步:引入依赖(除了基本的依赖,还有aop)
- 第二步:开启组件扫描
- 第三步:创建类,在类上添加创建对象注解
- 基于注解方式实现属性注入
- @Autowired:根据属性类型进行自动装配
- @Qualifier:根据属性名称进行注入
- @Resource:可以根据类型注入,可以根据名称注入
- @Value:注入普通类型属性
- 完全注解开发
- 创建配置类,替代xml配置文件
- 编写测试类
- 注解:
- 第一种方式:基于xml配置文件