Spring5系列(IOC的使用)
什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
- 使用 IOC 目的:为了耦合度降低
ioc的基本使用
- 在spring-framework-5.2.13.RELEASE文件中的lib目录中找到spring5的相关jar包,并导入到idea的lib目录下,如下:
- 创建普通类,在这个类创建普通方法
- 创建 Spring 配置文件bean1.xml,在配置文件(bean1.xml)配置创建的对象
- 进行测试代码编写
public void testBean(){
//读取spring的配置文件(这里是bean1.xml)
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//第一个参数是配置文件的id值。第二个参数是要获取的对象的Class类
User user = context.getBean("user", User.class);
//这里即可调用User的add方法
user.add();
}
1. IOC 底层原理(xml 解析、工厂模式、反射)
IOC的过程
- xml配置文件,创建配置的对象
- 通过工厂类创建对象
2. IOC(BeanFactory 接口)
-
IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
-
Spring 提供 IOC 容器实现两种方式:(两个接口)
BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用( 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象)
ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用(加载配置文件时候就会把在配置文件对象进行创建,这使得我们开发的程序更加快速) -
ApplicationContext 接口有实现类
3. IOC 操作 Bean 管理(基于 xml 方式)
什么是bean管理:
-
Spring 创建对象
-
Spirng 注入属性
-
基于 xml 方式创建对象(创建对象时候,默认也是执行无参数构造方法完成对象创建)
在 bean 标签有很多属性,介绍常用的属性:
id 属性:唯一标识
class 属性:类全路径(包类路径)
- 基于 xml 方式注入属性
3.1 第一种注入方式:使用 set 方法进行注入
-
创建Book类,并提供他的属性的set方法
-
在配置文件中注入属性
3.2 第二种注入方式:使用有参数构造进行注入
- 在配置文件中通过参数构造注入属性
3.3 p 名称空间注入
3.4 xml 注入其他类型属性
-
注入字面量
- null 值
- 属性值包含特殊符号(把内容写到CDATA)
-
注入属性-外部 bean
-
我们创建一个Dept对象(注意里面要有属性的set方法),他里面有User类属性:
-
在配置文件配置对象
-
注入属性-内部 bean
- 我们先创建两个类(Student) 和 (School)(他们有属性对应的set方法)
- 在配置文件配置对象
- 注入属性-级联赋值
- 第一种写法(有点像外部bean注入的方式)
- 第二种写法
1. 先给Student类增加School属性的get方法
2. 在配置文件配置对象
3.5 xml 注入集合属性
- 我们先创建一个CollectionBean,里面有各种的集合属性
- 我们在spring配置文件中配置CollectionBean,并为他注入集合属性
如果要在集合里面设置对象类型值:- 我们先在CollectionBean里面设置泛型为School的属性和对应的set方法
- 我们在spring配置文件中配置CollectionBean,并为他注入List集合(存放的是对象)
当我们如果要把一个集合注入到多个不同的对象中时我们可以使用 util 标签完成 list 集合注入提取
- 在 spring 配置文件中引入名称空间 util
- 在 spring 配置文件给注入提取出的list集合
3.6 FactoryBean
- Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
- 普通 bean:在配置文件中定义 bean 类型就是返回类型
- FactoryBean:在配置文件定义 bean 类型可以和返回类型不一样
FactoryBean的使用:- 创建类,让这个类作为工厂 bean,实现接口 FactoryBean;实现接口里面的方法,在实现的方法中定义返回的 bean 类型
- 在配置文件中配置FacctoryBean
- 测试
3.7 bean 作用域
- 在 Spring 里面,默认情况下,bean 是单实例对象
- 设置bean 为多实例对象
bean标签里的scope属性:默认值,singleton:表示是单实例对象
prototype:表示是多实例对象
singleton 和 prototype 区别: - singleton 单实例,prototype 多实例
- 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象;设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象
3.8 bean 生命周期
- 通过构造器创建 bean 实例(无参数构造)
- 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
- 调用 bean 的初始化的方法(需要进行配置初始化的方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
- bean 可以使用了(对象获取到了)
- 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
现在我们定义一个Life类来看一下Bean的生命周期的具体过程
然后我们演示添加后置处理器MyBeanPost,让他实现BeanPostProcessor接口,并实现BeanPostProcessor里的方法
然后我们测试一下:
注意我们每创建一个Bean实例都会执行后置处理器的两个方法一次
3.9 xml 自动装配
- 什么是自动装配?
根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入 - 下面演示一下自动装配
3.10 外部属性文件配置
若我们现在要配置数据库信息我们有两种方式:
3.10.1 第一种:直接配置数据库信息
- 引入德鲁伊连接池依赖 jar 包
- 然后在spring配置文件中配置数据库连接池的信息如下:
3.10.2 第二种:在 spring 配置文件使用标签引入外部属性文件
- 我们先引入 context 名称空间
- 在 spring 配置文件使用标签引入外部属性文件
4. IOC 操作 Bean 管理(基于注解方式)
4.1一. 什么是注解 ?
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解目的:简化 xml 配置
4.2 二.Spring 针对 Bean 管理中创建对象提供的注解如下
下面四个注解功能是一样的,都可以用来创建 bean 实例:
- @Component
- @Service:最好用在service层
- @Controller:最好用在web层
- @Repository:最好用在dao层
4.3 三.基于注解方式实现对象创建
- 我们先引入需要用的jar包到lib目录下
- 第二步,在配置文件中开启组件扫描
base-package属性为要扫描的包
- 创建类,在类上面添加创建对象注解
- 我们测试一下:(测试成功)
4.4 关于开启组件扫描细节配置
4.5 基于注解方式实现属性注入
- @Autowired:根据属性类型进行自动装配
第一步:在School和Student类中创建对象注解
第二步:在Student类的school属性上面添加**@Autowired**,并且该属性不需要添加 set 方法 - @Value:注入普通类型属性。如上两个图片**@Value**注解表示直接注入普通类型
- @Qualifier:根据名称进行注入,和上面**@Autowired** 一起使用
- @Resource:可以根据类型注入,可以根据名称注入
4.6 完全注解开发
- 我们先创建一个配置类,替代 xml 配置文件
- 然后编写一个测试类测试一下