Spring 學習 對象的⽣命週期、配置⽂件參數化、後置處理Bean

1、對象的⽣命週期

在這裏插入圖片描述

1、什麼是對象的⽣命週期

指的是⼀個對象創建、存活、消亡的⼀個完整過程

2、 爲什麼要學習對象的⽣命週期

由Spring負責對象的創建、存活、銷燬,瞭解⽣命週期,有利於我們使⽤好Spring爲我們創建的對象

⽣命週期的3個階段

1、創建階段

Spring⼯⼚何時創建對象
scope=“singleton”
Spring⼯⼚創建的同時,對象的創建
注意:設置scope=singleton 這種情況下 也需要在獲取對象的同時,創建對象

scope=“prototype”
Spring⼯⼚會在獲取對象的同時,創建對象ctx.getBean("")

2、、初始化階段

Spring⼯⼚在創建完對象後,調⽤對象的初始化⽅法,完成對應的初始化操作

  1. 初始化⽅法提供:程序員根據需求,提供初始化⽅法,最終完成初始化操作
  2. 初始化⽅法調⽤:Spring⼯⼚進⾏調⽤

InitializingBean接⼝
//程序員根據需求,實現的⽅法,完成初始化操作
public void
afterProperitesSet(){
}

對象中提供⼀個普通的⽅法
public void myInit(){
}

細節分析
1、如果⼀個對象即實現InitializingBean 同時⼜提供的 普通的初始化⽅法 順序

  1. InitializingBean
  2. 普通初始化⽅法

2、注⼊⼀定發⽣在初始化操作的前⾯
3、什麼叫做初始化操作
資源的初始化:數據庫 IO ⽹絡

3、銷燬階段

Spring銷燬對象前,會調⽤對象的銷燬⽅法,完成銷燬操作

  1. Spring什麼時候銷燬所創建的對象? ctx.close();
  2. 銷燬⽅法:程序員根據⾃⼰的需求,定義銷燬⽅法,完成銷燬操作
    調⽤:Spring⼯⼚完成調⽤

DisposableBean
public void destroy()throws
Exception{

}

定義⼀個普通的銷燬⽅法
public void myDestroy()throws
Exception{
}

細節分析
1.銷燬⽅法的操作只適⽤於 scope=“singleton”
2. 什麼叫做銷燬操作
主要指的就是 資源的釋放操作 io.close() 、connection.close();

2、配置⽂件參數化

把Spring配置⽂件中需要經常修改的字符串信息,轉移到⼀個更⼩的配置⽂件中

  1. Spring的配置⽂件中存在需要經常修改的字符串?
    存在 以數據庫連接相關的參數 代表
  2. 經常變化字符串,在Spring的配置⽂件中,直接修改
    不利於項⽬維護(修改)
  3. 轉移到⼀個⼩的配置⽂件(.properties)
    利於維護(修改)

配置⽂件參數化:利於Spring配置⽂件的維護(修改)

1、配置⽂件參數的開發步驟

提供⼀個⼩的配置⽂件(.properities)

名字:隨便
放置位置:隨便
jdbc.driverClassName =com.mysql.jdbc.Driver
jdbc.url =jdbc:mysql://localhost:3306/suns? useSSL=false
jdbc.username = root
jdbc.password = 123456

Spring的配置⽂件與⼩配置⽂件進⾏整合

applicationContext.xml
<context:property-placeholder location="classpath:/db.properties"/>

在Spring配置⽂件中通過${key}獲取⼩配置⽂件中
對應的值
在這裏插入圖片描述

3、⾃定義類型轉換器

1、類型轉換器

作⽤:Spring通過類型轉換器把配置⽂件中字符串類型的數據,轉換成了對象中成員變量對應類型的數據,進⽽完成了注⼊
在這裏插入圖片描述

2、⾃定義類型轉換器

原因:當Spring內部沒有提供特定類型轉換器時,⽽程序員在應⽤的過程中還需要使⽤,那麼就需要程序員⾃⼰定義類型轉換器

類 implements Converter接⼝

public class MyDateConverter
implements Converter<String,
Date> {

 @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;
 }

convert⽅法作⽤:String —> Date
SimpleDateFormat sdf = newSimpleDateFormat();
sdf.parset(String) —> Date
param:source 代表的是配置⽂件中 ⽇期字符串 2020-10-11
return : 當把轉換好的Date作爲convert⽅法的返回值後,Spring⾃動的爲birthday屬性進⾏注⼊(賦值)

在Spring的配置⽂件中進⾏配置

MyDateConverter對象創建出來

<bean id="myDateConverter"  class="xxxx.MyDateConverter"/>

類型轉換器的註冊

⽬的:告知Spring框架,我們所創建的MyDateConverter是⼀個類型轉換器
<!--⽤於註冊類型轉換器-->
<bean id="conversionService"  class="org.springframework.context.support.ConversionServiceFa
ctoryBean">
 <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;
 }

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)

3、後置處理Bean

BeanPostProcessor作⽤:對Spring⼯⼚所創建的對象,進⾏再加⼯。

AOP底層實現:
注意:BeanPostProcessor接⼝xxxx(){
}
後置處理Bean的運⾏原理分析
在這裏插入圖片描述`程序員實現BeanPostProcessor規定接⼝中的⽅法:
Object postProcessBeforeInitiallization(Object bean String beanName)
作⽤:Spring創建完對象,並進⾏注⼊後,可以運⾏Before⽅法進⾏加⼯獲得Spring創建好的對象 :通過⽅法的參數最終通過返回值交給Spring框架

實戰中:
很少處理Spring的初始化操作:沒有必要區分Before After。只需要實現其中的⼀個After⽅法即可
注意:
postProcessBeforeInitiallization
return bean對象

BeanPostProcessor的開發步驟
1、 實現 BeanPostProcessor接⼝

public class MyBeanPostProcessor implements BeanPostProcessor
{
 @Override
 public Object postProcessBeforeInitialization(Object bean, String beanName) throws  BeansException {
 return bean;
 }
//修改了categroy 的name 值
public Object  postProcessAfterInitialization(Object bean, String  beanName) throws BeansException {
 Categroy categroy =(Categroy) bean;

categroy.setName("xiaowb");
 return categroy;
 }
}

Spring的配置⽂件中進⾏配置

<bean  id="myBeanPostProcessor"  class="xxx.MyBeanPostProcessor"/>

BeanPostProcessor細節

BeanPostProcessor會對Spring⼯⼚中所有創建的對象進⾏加⼯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章