Day380.⼯⼚高级特性 -Spring5
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day380.⼯⼚高级特性 -Spring5相关的知识,希望对你有一定的参考价值。
⼯⼚⾼级特性
一、对象的⽣命周期
1. 什么是对象的⽣命周期
指的是⼀个对象创建、存活、消亡的⼀个完整过程
2. 为什么要学习对象的⽣命周期
由Spring负责对象的创建、存活、销毁,了解⽣命周期,有利于我们使⽤好Spring为我们创建的对象
3. ⽣命周期的3个阶段
-
创建阶段
Spring⼯⼚何时创建对象
-
scope=“singleton”
Spring⼯⼚创建的同时,对象的创建
注意:设置scope=singleton 这种情况下 也需要在获取对象的同时,创建对象
,通过lazy-init
属性<bean lazy-init="true"/>
-
scope=“prototype”
Spring⼯⼚会在获取对象的同时,创建对象
ctx.getBean("")
-
-
初始化阶段
Spring⼯⼚在创建完对象后,调⽤对象的初始化⽅法,完成对应的初始化操作
- 初始化⽅法提供:程序员根据需求,提供初始化⽅法,最终完成初始化操作
- 初始化⽅法调⽤:Spring⼯⼚进⾏调⽤
-
实现InitializingBean接⼝
//程序员根据需求,实现的⽅法,完成初始化操作 public void afterProperitesSet(){}
-
对象中提供⼀个普通的⽅法,通过
init-method
标签来指明该方法为初始化方法public void myInit(){}
<bean id="product" class="xxx.Product" init-method="myInit"/>
-
细节分析
-
如果⼀个对象即实现InitializingBean 同时⼜提供的 普通的初始化⽅法
顺序
- InitializingBean
- 普通初始化⽅法
-
注⼊⼀定发⽣在初始化操作的前⾯
-
什么叫做初始化操作
资源的初始化:数据库 IO ⽹络 …
-
-
销毁阶段
Spring销毁对象前,会调⽤对象的销毁⽅法,完成销毁操作
- Spring什么时候销毁所创建的对象?
ctx.close();//关闭工程前执行 - 销毁⽅法:程序员根据⾃⼰的需求,定义销毁⽅法,完成销毁操作
调⽤:Spring⼯⼚完成调⽤
-
实现DisposableBean接口
public void destroy()throws Exception{}
-
定义⼀个普通的销毁⽅法,通过
destroy-method
标签,指明初始化方法public void myDestroy()throws Exception{}
<bean id="" class="" init-method="" destroy-method="myDestroy"/>
-
细节分析
-
销毁⽅法的操作
只适⽤于 scope="singleton"
-
什么叫做销毁操作
主要指的就是资源的释放操作(
关闭连接等
) io.close() ,connection.close(); -
- Spring什么时候销毁所创建的对象?
二、配置⽂件参数化
把Spring配置⽂件中需要经常修改的字符串信息,转移到⼀个更⼩的配置⽂件中
- Spring的配置⽂件中存在需要经常修改的字符串?
存在 以数据库连接相关的参数 代表经常变化
字符串,在Spring的配置⽂件中,直接修改
不利于项⽬维护(修改)- 转移到⼀个⼩的配置⽂件(
.properties
)
利于维护(修改)
配置⽂件参数化:利于Spring配置⽂件的维护(修改)
1. 配置⽂件参数的开发步骤
- 提供⼀个⼩的配置⽂件(.properities)
名字:随便
放置位置:随便
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/achang?useSSL=false
jdbc.username = root
jdbc.password = 123456
- **Spring的配置⽂件与⼩配置⽂件进⾏整合**
applicationContext.xml
```xml
<context:property-placeholder location="classpath:/db.properties"/>
- 在Spring配置⽂件中通过${key}获取⼩配置⽂件中对应的值
三、⾃定义类型转换器
1. 类型转换器
-
作⽤:
Spring通过类型转换器把配置⽂件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进⽽完成了注⼊
2. ⾃定义类型转换器
-
原因:
当Spring内部没有提供特定类型转换器时,⽽程序员在应⽤的过程中还需要使⽤,那么就需要程序员⾃⼰定义类型转换器
-
类 implements Converter接⼝
public class MyDateConverter implements Converter<String, Date> { /* convert⽅法作⽤:String ---> Date SimpleDateFormat sdf = new SimpleDateFormat(); sdf.parset(String) ---> Date param: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="xxxx.MyDateConverter"/>
-
类型转换器的注册
- ⽬的:
告知Spring框架,我们所创建的MyDateConverter是⼀个类型转换器
<!--⽤于注册类型转换器--> <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 sdf = new SimpleDateFormat(); sdf.parset(String) ---> Date param: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; } }
<!--Spring创建MyDateConverter类型对象--> <bean id="myDateConverter" class="com.baizhiedu.converter.MyDateConverter"> <property name="pattern" value="yyyy-MM-dd"/> </bean>
-
ConversionSeviceFactoryBean 定义 id属性 值必须
conversionService
-
Spring框架内置⽇期类型的转换器
⽇期格式:2020/05/01 (不⽀持 :2020-05-01)
四、后置处理Bean
-
BeanPostProcessor作⽤:对Spring⼯⼚所创建的对象,进⾏
再加⼯
。 -
AOP底层实现:
注意:BeanPostProcessor接⼝
xxxx(){
}
- 后置处理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⽅法即可
注意:
postProcessBeforeInitiallization
return bean对象
-
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 { Categroy categroy = (Categroy) bean; categroy.setName("achang"); return categroy; } }
-
Spring的配置⽂件中进⾏配置
<bean id="myBeanPostProcessor" class="xxx.MyBeanPostProcessor"/>
-
BeanPostProcessor细节
BeanPostProcessor会对Spring⼯⼚中
所有创建
的对象进⾏加⼯
。
-
以上是关于Day380.⼯⼚高级特性 -Spring5的主要内容,如果未能解决你的问题,请参考以下文章
不知名大佬分享的Alibaba内部Java高级架构师380道面试题,直接3杀斩获阿里腾讯网易offer
深度学习与图神经网络核心技术实践应用高级研修班-Day3对抗生成网络(Generative Adversarial Networks)