第十章、对象的生命周期
1.什么是对象的生命周期
指的是一个对象的创建,存活,消亡的一个完整过程
2.为什么要学习对象的生命周期
由Spring负责对象的创建,存活,销毁,了解生命周期,有利于我们使用好Spring为我们创建对象
3.生命周期的3个阶段
创建阶段
Spring工厂何时创建对象
scope =“singleton”
Spring工厂创建的同时,完成对象的创建
注意:设置scope=singleton 这种情况下 也需要在获取对象的同时,创建对象
<bean lazy-init="true"/>
scope = “prototype”
Spring工厂会在获取对象的同时,创建对象
ctx.getBean("")
初始化阶段
Spring工厂在创建对象后,调用对象的初始化方法,完成对应的初始化操作
1.初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化过程
2.初始化方法调用:Spring工厂进行调用
InitialiaingBean接口
#程序员根据需求,实现的方法,完成初始化操作
public void afterProperitesSet()
对象中提供一个普通方法
public void myInit(){
}<bean id="product" class="com.yusael.life.Product" init-method="myInit"/>
细节分析
1.如果一个对象既实现了InitializingBean接口,同时又提供普通的初始化方法
1.InitializingBean接口
2.普通的初始化方法
2.注入一定发生在初始化之前
3.什么叫做初始化操作
1.资源的初始化:数据库 IO 网络.....
销毁阶段
Spring销毁对象前,会调用对象的销毁方法,完成销毁操作
1.Spring什么时候销毁所创建的对象
ctx.close(); 工厂关闭
2.销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作
调用:Spring工厂完成调用
DisposableBean接口
#实现DisposableBean接口,调用其中的销毁方法
public class Product implements DisposableBean {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
定义一个普通的销毁方法
#通过配置文件统一通过普通方法进行销毁
public class Product {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
public void myDestory() {
System.out.println("Product.myDestory");
}
}
配置文件:
<bean id="product" class="com.yusael.life.Product" destroy-method="myDestory"/>
细节分析
1.销毁方法的操作只适用于scope=“singleton”
2.什么叫销毁操作
1.主要指的就是资源的释放操作: io.close(); connection.close();
第十一章、配置文件参数化
1.把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中
1.Spring的配置文件中存在需要经常修改的字符串?
存在 以数据库连接相关的参数 代表
2.经常变化的字符串,在Spring配置文件中,直接修改
不利于项目维护(修改)
3.转移到一个小的配置文件(.properties)
有利于维护(修改)
配置文件参数化:有利于Spring配置文件的维护(修改)
1.配置文件参数的开发步骤
提供一个小的配置文件(.properties)
名字:随便
放置位置:随便
#提供一个小的配置文件(.properties)
名字:随便
放置位置:随便jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mysql?useSSL=false
jdbc.username = root
jdbc.password = ll
Spring的配置文件与小配置文件进行整合
#applicationContext.xml
<context:property-placeholder location="classpath:/db.properties"/>
第十二章、自定义类型转换器
1.类型转换器
1.作用:Spring通过类型转换器把配置文件中的字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成注入
2.自定义类型转换器
原因:当Spring内部没有提供特定类型转换器的时,而程序员在应用的过程中还需要使用,那么就需要程序员自己定义类型转换器
开发步骤:
类implement Convert接口
public class MyDateConverter implements Converter<String, Date> {
/*
convert方法作用: String ---> Date
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.parset(String) ---> Date参数:
source : 代表的是配置文件中, 日期字符串 <value>2020-10-11</value>
return : 当把转换好的 Date 作为 convert 方法的返回值后,
Spring ⾃动的为birthday属性进行注入(赋值)
*/
@Override
public Date convert(String source) {
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
在Spring配置文件中进行配置
MyDateConverter对象创建出来
<bean id = "myDteConverter" class = "xxxx.MyDateConverter"/>
类型转换器的注册
目的:告知Spring框架,我们所创建的MyDateConverter是一个类型转换器
<!--创建 MyDateConverter 对象-->
<bean id="myDateConverter" class="com.yusael.converter.MyDateConverter"/>
<!--用于注册类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myDateConverter"/>
</set>
</property>
</bean><bean id="good" class="com.yusael.converter.Good">
<property name="name" value="liulei"/>
<property name="birthday" value="2022-7-26"/>
</bean>
3.细节
MyDateConverter中的日期格式,通过依赖注入的方式,由配置文件进行赋值
public class MyDateConverter implements Converter<String, Date> {
private String pattern;public String getPattern() {
return pattern;
}public void setPattern(String pattern) {
this.pattern = pattern;
}/*
convert方法作用:String--->Date
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.parset(String) --->Dateparam:source : 代表的是配置文件中, 日期字符串 <value>2020-10-11</value>
return:当把转换好的Date作为convert方法返回值后,Spring自动的为birthday属性进行注入(赋值)
*/
@Override
public Date convert(String source) {
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}return date;
}
}
<bean id="myDateConverter" class="com.liulei.converter.MyDateConverter">
<property name="pattern" value="yyyy-MM-dd"/>
</bean>
ConversionServiceFactoryBean定义id属性 值必须为conversionService
Spring框架内置日期类型的转换器
1.日期格式:2022/07/26 不支持{2022-07-26}
十三章、后置处理Bean
BeanPostProcessor作用:对Spring工厂所创建的对象,进行再加工。
AOP底层实现:
注意:BeanPostProcessor接口
xxxx(){
放置需要加工的内容
}
后置处理Bean的运行原理分析
程序员实现BeanPostProcessor规定的接口方法:
Object postProcessorBeforeInitialization(Object bean String beanName)
作用:Spring创建完对象,并且完成注入后,可以运行Before方法进行加工
获得Spring创建好的对象:通过方法的参数
最终通过返回值交给Spring框架
Object postProcessorAfterInitialization(Object bean String beanName)
作用:Spring在执行完对象的初始化后,可以运行After方法进行加工
获得Spring创建好的对象:通过方法的参数
最终通过返回值交给Spring框架
实战中:很少处理Spring初始化操作,没有必要区分Before After,只需要实现After方法即可,但是Before方法必须return。
BeanPostProcessor的开发步骤:
1.类实现BeanPostProcessor接口
#实现BeanPostProcessor接口中的两个方法
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
Category category = (Category) bean;
category.setName("xiaowangba");
return category;
}
}
2.Spring配置文件进行配置
<bean id = "myBeanPostProcessor" class = "xxx.myBeanPostProcessor"/>
3.BeanPostProcessor细节
BeanPostProcessor会对Spring工厂所创建的所有对象进行加工