继上一篇Spring IOC 、DI的学习知识梳理之后,又开始了新的挣扎,本期内容主要是围绕Spring工厂的一些高级特性来展开学习的,也算是为下一篇AOP的学习做一个前置梳理,话不多说,开干!
上一篇中提到了一个关键的词——Spring Bean,对它的形成过程也进行了简单的概述,但是并没有更为详细的研究,那么现在就一起来看看关于Spring Bean到底有什么值得探究的呢?
回想上一篇文章中我们是根据Java对象引入的Spring Bean
由上图可知,Bean也是Java对象,既然它是Java对象,相应的是不是也应该有生命周期,既然有生命周期,那么随之而来的问题就很多了
什么是Bean的⽣命周期?
Bean的生命周期——是一个过程——是由Bean的创建、存活、消亡等三个阶段来构成的一个过程
为什么要了解Bean的生命周期?
在实际开发中我们经常需要对Bean进行二次的加工和扩展,这种情况的前置条件就是需要对Bean有足够的认识和掌握
解决了学习前的疑问之后,我们直接上正文
Bean的创建:
默认情况下,Spring在创建工厂的同时,也会根据我们提供的配置文件中<bean/>标签中的id值给我们创建好相应的Bean
Bean的初始化:
Spring工厂创建完Bean后会调用相应的初始化方法进行初始化操作
注意:
1.初始化方法由程序员根据需求设计提供
2.初始化方法由Spring工厂进行调用,而非程序员
对于Bean的初始化Spring为其提供了一个接口——InitializingBean,该接口中只有一个afterPropertiesSet()方法,也就是说凡是实现该接口的实现类都需要执行afterPropertiesSet()方法来对Bean进行初始化操作
public interface InitializingBean {
/**
* Invoked by the containing {@code BeanFactory} after it has set all bean properties
//在设置所有bean属性后调用————也就是DI之后,进行调用
* and satisfied {@link BeanFactoryAware}, {@code ApplicationContextAware} etc.
* <p>This method allows the bean instance to perform validation of its overall
* configuration and final initialization when all bean properties have been set.
此方法允许bean实例对其整个bean实例执行验证,以便在设置了所有bean属性后对其总体配置和最终初始化进行验证
* @throws Exception in the event of misconfiguration (such as failure to set an
* essential property) or if initialization fails for any other reason
*/
void afterPropertiesSet() throws Exception;
}
除了系统初始化之外,Spring还提供了自定义初始化功能
步骤分析
1.在类中定义一个自定义初始化的方法init()
2.在xml中相应bean标签中添加————init-method="init",并指定我们要使用的初始化方法
3.获取类的实例对象
1.
2.
3.
问题来了!!!!
既然Bean有两种方法进行初始化方式,如果一个Bean即实现了InitializingBean接口,又为它提供了自定义初始化方法,那么它们的顺序谁先谁后呢?
答案是这样子滴!
1.InitializingBean ————>2.自定义初始化方法
Bean的销毁:
Spring在销毁Bean之前会调用Bean自身的销毁方法来完成销毁操作,就像我们关闭IO流或者关闭连接驱动一样,直接Close掉,如果想要销毁所有Bean,那就直接将Spring的工厂Close掉就ok了!
好了,关于Bean的一个小热身我们就到这里了,精彩内容继续.........
插播一条Spring实际开发思想
在实际开发中我们会用到一些经常需要修改参数的变量(比如:数据源配置),这个时候如果去挨个改代码的话不仅工作量大,还存在太多的耦合反应,那么这个时候我们常用的选择就是把这些参数提出来放到小配置文件中,如果需要修改,只需要修改配置文件的内容即可——————具体配置自行百度
在日常开发中,除了以上这些零碎的知识点外,还有一些格式、类型等上的要求,比如我们的时间格式,String赋值给Interger,或者是需要转换成程序员自定义的类型转换等等,这里就来实现一个自定义的时间转换器
自定义时间类型转换器步骤:
1.编写自定义时间类型转换器
2.将自定义的转换器注册到Spring中
3.由Spring调用我们自定义的时间类型转换
1.编写自定义时间类型转换器
package com.xiaozhao.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author : Carson-Zhao
* @date : 2020/9/5 17:03
*/
public class MyDateConverter implements Converter<String, Date> {
#实现Converter接口,重写convert方法,返回的数据为对应类型属性的值
/**
* String——>为需要转换原类型
* Date————>为最终转换的类型
*
* @param source 传入的数据
* @return
*/
@Override
public Date convert(String source) {
Date date = null;
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
date = dateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
2.将自定义的转换器注册到Spring中
<bean id="myDateConverter" class="com.xiaozhao.spring.config.MyDateConverter"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" ref="myDateConverter"/>
</bean>
3.系统调用自定义类型转换器
为了验证我们的自定义类型转换器是否已经生效,我们在User里面加了一个Date类型的birthday属性,现在要将String类型的数据传入,赋值给birthday
接下来就看看运行结果
小百科:Spring默认的日期类型转换器所支持的格式为:2020/09/05 不支持格式:20-09-05
总结:
本篇笔记有点乱,讲的内容没有太多的关联性,这些算是学习AOP的一个前置小知识吧,只要思路清晰,我觉得完全是没问题的,这些小知识在日常还是很常见的,如果不会出来,不知道原理,也是比较难受。
下一篇正式进入AOP的学习,个人感觉动态代理思想是无处不在,恰好,在我们的Spring AOP中将其展现得淋漓尽致,无论是JDK还是Cglib的代理模式都值得每一个程序员去细嚼慢咽,本篇给讲了一丝丝的Spring Bean的相关生命周期,也算是一个预热
最后,写上自己喜欢的一句话:
每个牛逼的人都有一段苦逼的岁月,但是只要你像SB一样的去坚持,终将牛逼!