写点什么

【Spring5,贼厉害

用户头像
极客good
关注
发布于: 刚刚
  1. 如果?个对象既实现 InitializingBean 同时又提供的 普通的初始化方法,执行顺序?


答:先执行 InitializingBean,再执行 普通初始化方法。


  1. 注入?定发生在初始化操作的前面。

  2. 初始化操作到底是什么?


资源的初始化:数据库、IO、网络、…


[](


)销毁阶段 - DisposableBean、destroy-method




Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作。


Spring 什么时候销毁所创建的对象?ctx.close();


销毁方法提供:程序员根据业务需求,定义销毁方法,完成销毁操作


销毁方法调用:Spring 工厂进行调用。


开发流程与初始化操作一样,提供销毁方法的两种方式:


  1. DisposableBean 接口:


public class Product implements DisposableBean {


// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作


@Override


public void destroy() throws Exception {


System.out.println("Product.destroy");


}


}


  1. 对象中提供一个普通的销毁方法,配置文件种配置 destroy-method


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. 销毁操作到底是什么?


资源的释放: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 配置文件中需要经常修改的字符串信息,转移到?个更小的配置文件中。


  1. Spring 的配置文件中是否存在需要经常修改的字符串?


存在:以数据库连接相关的参数…


  1. 经常变化字符串,在 Spring 的配置文件中,直接修改不利于项目维护(修改)

  2. 转移到?个小的配置文件(.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">


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


<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">

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Spring5,贼厉害