【Spring5,贼厉害
如果?个对象既实现
InitializingBean
同时又提供的 普通的初始化方法,执行顺序?
答:先执行 InitializingBean
,再执行 普通初始化方法。
注入?定发生在初始化操作的前面。
初始化操作到底是什么?
资源的初始化:数据库、IO、网络、…
[](
)销毁阶段 - DisposableBean、destroy-method
Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作。
Spring 什么时候销毁所创建的对象?ctx.close();
销毁方法提供:程序员根据业务需求,定义销毁方法,完成销毁操作
销毁方法调用:Spring 工厂进行调用。
开发流程与初始化操作一样,提供销毁方法的两种方式:
DisposableBean
接口:
public class Product implements DisposableBean {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
对象中提供一个普通的销毁方法,配置文件种配置
destroy-method
:
public class Product {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
public void myDestory() {
System.out.println("Product.myDestory");
}
}
<bean id="product" class="com.yusael.life.Product" destroy-method="myDestory"/>
销毁阶段细节分析:
销毁方法的操作只适用于
scope="singleton"
,初始化操作都适用。销毁操作到底是什么?
资源的释放:io.close()
、connection.close()
、…
[](
)对象的生命周期总结
public class Product implements InitializingBean, DisposableBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("Product.setName");
this.name = name;
}
Product() { // 创建
System.out.println("Product.Product");
}
// 程序员根据需求实现的方法, 完成初始化操作
public void myInit() {
System.out.println("Product.myInit");
}
// 程序员根据需求实现的方法, 完成初始化操作
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
public void myDestory() {
System.out.println("Product.myDestory");
}
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
<bean id="product" class="com.yusael.life.Product" init-method="myInit" destroy-method="myDestory">
<property name="name" value="yusael"/>
</bean>
[](
)配置文件参数化
==========================================================================
配置文件参数化:把 Spring 配置文件中需要经常修改的字符串信息,转移到?个更小的配置文件中。
Spring 的配置文件中是否存在需要经常修改的字符串?
存在:以数据库连接相关的参数…
经常变化字符串,在 Spring 的配置文件中,直接修改不利于项目维护(修改)
转移到?个小的配置文件(.properties)利于维护(修改)
优点:利于 Spring 配置文件的维护(修改)
[](
)配置文件参数的开发步骤
提供?个小的配置文件(.properities)
名字:没有要求
放置位置:没有要求
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/spring?useSSL=false
jdbc.username = root
jdbc.password = 1234
Spring 的配置文件与小配置文件进行整合:
<context:property-placeholder location="classpath:/db.properties"/>
在 Spring 配置文件中通过 ${key}
获取小配置文件中对应的值:
<bean id="conn" class="com.yusael.factorybean.ConnectionFactoryBean">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
[](
)自定义类型转换器
===========================================================================
[](
)类型转换器
作用:Spring 通过 类型转换器 把 配置文件 中 字符串 类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入。
[](
)自定义类型转换器
产生原因:当 Spring 内部没有提供特定类型转换器时,而程序员在应用的过程中还需要使用,那么就需要程序员自己定义类型转换器。
[开发步骤]:
类 implements Converter 接口
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="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="zhenyu"/>
<property name="birthday" value="2012-12-12"/>
</bean>
[](
)自定义类型转换器细节
MyDateConverter
中的日期的格式,通过 依赖注入 的方式,由配置文件完成赋值。
public class MyDateConverter implements Converter<String, Date> {
private String pattern;
@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;
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
}
<bean id="myDateConverter" class="com.yusael.converter.MyDateConverter">
<property name="pattern" value="yyyy-MM-dd"/>
</bean>
ConversionSeviceFactoryBean
定义 id 属性,值必须是conversionService
;
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
评论