Spring5学习随笔-生命周期、自定义类型转换器、后置处理Bean
学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】
第十章、对象的生命周期
1.什么是对象的生命周期
指的是一个对象创建、存活、消亡的一个完整过程
2.为什么要学习对象的生命周期
由Spring负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建的对象
3.生命周期的3个阶段
-
创建阶段
Spring工厂何时创建对象
-
scope=”singleton”
Spring工厂创建的同时,创建对象
注意:如果要在ctx.getBean(””)的时候创建对象可以设置
-
scope=”prototype”
Spring工厂会在获取对象的同时,创建对象
ctx.getBean(””)
-
-
初始化阶段
Spring工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化操作
- 初始化方法提供:程序员根据需求,定义初始化方法,最终完成初始化操作
- 初始化方法调用:Spring工厂进行调用
-
InitalizingBean接口
// 程序员根据需求、实现的方法,完成初始化操作 public void afterProperitesSet()
-
对象中提供一个普通的方法
public void myInit(){ } // 在配置文件中 调用init-method 也可以实现初始化操作 <bean id="product" class="xxx.Product" init-method="mtInit"
-
细节分析
-
如果一个对象即实现InitializingBean 同时又提供普通的初始化方法,那他们的顺序是什么
先执行InitialzingBean再执行普通的初始化方法
-
注入一定发生再初始化操作的前面
-
什么是初始化操作
资源的初始化:数据库 IO 网络
-
-
销毁阶段
Spring销毁对象前,会调用对象的销毁方法,完成销毁操作
-
Spring什么时候销毁所创建的对象
ctx.close();
-
销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作
调用:Spring工厂完成调用
-
DisposableBean (spring提供的接口)
public void destroy()thorws Exception{ }
-
定义一个普通的销毁方法,在配置文件配置
<bean id="product" destroy-method="myDestroy"/>
-
细节分析
-
销毁方法的操作只适用于scope=”singleton“
-
什么叫做销毁操作
主要指的是 资源的释放操作,io.close() connection.close();
-
-
第十一章、配置文件参数化
- 把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中。
-
Spring的配置文件中存在需要经常修改的字符串?
存在,以数据库连接相关的参数 代表
-
经常变化字符串,在Spring的配置文件中,直接修改,不利于项目维护(不好修改)
-
转移到一个小的配置(.properties)
利于维护(修改)
-
配置文件参数化:利于Spring文件的维护(修改)
1.配置文件参数的开发步骤
-
提供一个小的配置文件(.properities)
jdbc.DriverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/myschool?useSSL=false&allowPublicKeyRetrieval=true jdbc.username = root jdbc.password = 123456
-
Spring的配置文件与小配置文件进行整合
applicationContext.xmgl <context:property-placeholder location="classpath:/db.properties"/>
-
在Spring配置文件中通过${key}获取小配置文件中对应的值
第十二章、自定义类型转换器
1.类型转换器
2.自定义类型转换器
原因:当Spring内部没有提供特定类型转换器时,而程序员在应用的过程中还要使用,那么就需要程序员自己定义自定义类型转换器
- 类Implements Converter接口
public class MyDateConverter implements Converter<String, Date> {
/*
convert方法作用:String --->Date
SimpleDateFormat.parset("")
param:source 代表的是配置文件中的 日期字符串 <value>2020-1-2</value>
return:当把转换好的Date作为convert方法的返回值后,Spring自动为birthday属性进行注入(赋值)
*/
@Override
public Date convert(String source) {
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
- 在Spring的配置文件中进行配置
-
MyDateConverter对象创建出来
<bean id=”myDateConverter” class=”xxx.MyDateConverter”/>
-
类型转换器的注册
目的:告知Spring框架,我们所创建的MyDateConverter是一个类型转换器
<!-- 用于注册类型转换器--> id必须命名为conversionService <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" > <property name="converters"> <set> <ref bean="myDateConverter"/> </set> </property> </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.parset("")
param:source 代表的是配置文件中的 日期字符串 <value>2020-1-2</value>
return:当把转换好的Date作为convert方法的返回值后,Spring自动为birthday属性进行注入(赋值)
*/
@Override
public Date convert(String source) {
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try {
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
<!-- Spring创建MyDateConverter类型对象-->
<bean id="myDateConverter" p:pattern="yyyy-MM-dd" class="com.baizhi.converter.MyDateConverter"/>
-
ConversionServiceFactoryBean 定义id属性值 必须为conversionService
-
Spring框架内置日期类型的转换器
日期格式:支持的是:2020/05/01(2020-05-01是不支持的)
第十三章、后置处理Bean
Aop底层实现:
注意:BeanPostProcessor是一个接口,把想要的加工操作写在接口所规定的方法中。
- 后置处理Bean的运行原理分析
-
程序员要实现BeanPostProcessor规定接口中的方法:
- Object postProcessBeforeInitiallization(Object bean,String beanName)
- 作用:Spring创建完对象,并进行注入后,可以运行Before方法进行加工
- 获得Spring创建好的对象:通过方法的参数
- 最终通过返回值交给Spring框架
- Object postProcessAfterInitiallization(Object bean,String beanName)
- 作用:Spring执行完对象的初始化操作后,可以运行After方法进行加工
- 获得Spring创建好的对象:通过方法的参数
- 最终通过返回值交给Spring框架
实战中:很少处理Spring的初始化操作:没有必要区分Before、After。只需要实现其中的一个After方法即可(实现了初始化,再做区分)
注意:postProcessAfterInitiallization(一定要返回bean对象)
return bean
- Object postProcessBeforeInitiallization(Object bean,String beanName)
-
BeanPostProcess的开发步骤
-
类实现BeanPostProcess接口
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 { Categroy categroy = (Categroy) bean; categroy.setName("xiaowb"); return categroy; } }
-
Spring的配置文件中进行配置
<bean id="myBeanPostProcessor" class="com.baizhi.beanpost.MyBeanPostProcessor"></bean>
-
BeanPostProcessor细节
BeanPostProcessor会对Spring工厂中创建的所有对象进行加工,所以要对要修改的对象进行保护
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // 加上保护 if (bean instanceof Categroy) { Categroy categroy = (Categroy) bean; categroy.setName("xiaowb"); } return bean; }
-
作者:扬眉剑出鞘
出处: https://www.cnblogs.com/eyewink/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。