1. 程式人生 > 其它 >Spring一套全通—工廠高階

Spring一套全通—工廠高階

百知教育 — Spring系列課程 — 工廠高階特性


第十章、物件的生命週期

1. 什麼是物件的生命週期
指的是一個物件建立、存活、消亡的一個完整過程
2. 為什麼要學習物件的生命週期
由Spring負責物件的建立、存活、銷燬,瞭解生命週期,有利於我們使用好Spring為我們建立的物件
3. 生命週期的3個階段
  • 建立階段

    Spring工廠何時建立物件
    
    • scope="singleton"

      Spring工廠建立的同時,物件的建立
      
      注意:設定scope=singleton 這種情況下 也需要在獲取物件的同時,建立物件 
      <bean lazy-init="true"/>
      
    • scope="prototype"

      Spring工廠會在獲取物件的同時,建立物件
      ctx.getBean("")
      
  • 初始化階段

    Spring工廠在建立完物件後,呼叫物件的初始化方法,完成對應的初始化操作
    
    1. 初始化方法提供:程式設計師根據需求,提供初始化方法,最終完成初始化操作
    2. 初始化方法呼叫:Spring工廠進行呼叫
    
    • InitializingBean介面

      //程式設計師根據需求,實現的方法,完成初始化操作
      public void afterProperitesSet(){
        
      }
      
    • 物件中提供一個普通的方法

      public void myInit(){
        
      }
      
      <bean id="product" class="xxx.Product" init-method="myInit"/>
      
    • 細節分析

      1. 如果一個物件即實現InitializingBean 同時又提供的 普通的初始化方法 順序

        1. InitializingBean 
        2. 普通初始化方法
        
      2. 注入一定發生在初始化操作的前面

      3. 什麼叫做初始化操作

        資源的初始化:資料庫 IO 網路 .....
        
  • 銷燬階段

    Spring銷燬物件前,會呼叫物件的銷燬方法,完成銷燬操作
    
    1. Spring什麼時候銷燬所建立的物件?
       ctx.close();
    2. 銷燬方法:程式設計師根據自己的需求,定義銷燬方法,完成銷燬操作
          呼叫:Spring工廠完成呼叫
    
    • DisposableBean

      public void destroy()throws Exception{
        
      }
      
    • 定義一個普通的銷燬方法

      public void myDestroy()throws Exception{
      
      }
      <bean id="" class="" init-method="" destroy-method="myDestroy"/>
      
    • 細節分析

      1. 銷燬方法的操作只適用於 scope="singleton"

      2. 什麼叫做銷燬操作

        主要指的就是 資源的釋放操作  io.close() connection.close();
        

第十一章、配置檔案引數化

把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}獲取小配置檔案中對應的值

第十二章、自定義型別轉換器

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的開發步驟

    1. 類 實現 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("xiaowb");
      
      
              return categroy;
          }
      }
      
    2. Spring的配置檔案中進行配置

      <bean id="myBeanPostProcessor" class="xxx.MyBeanPostProcessor"/>
      
    3. BeanPostProcessor細節

      BeanPostProcessor會對Spring工廠中所有建立的物件進行加工。