日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java创建子类对象的步骤_一通Spring骚操作:我敢说没人比我更懂Java对象创建

發布時間:2025/3/15 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java创建子类对象的步骤_一通Spring骚操作:我敢说没人比我更懂Java对象创建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、開篇一問

一個Spring Bean是Java對象嗎?那么一個對象是Spring Bean嗎?

帶著這個問題我們一起來回顧Spring的生命周期流程,徹底了解一個類在Spring中究竟做了哪些操作!

我們先看一段代碼!

誠然,相信只要是使用過Spring的人都應該知道,從Spring容器中獲取的對象,里面的EmailServiceImpl是被Spring自動注入了的!

但是相同的點是,他們兩個都是一個Java對象,都是加載在JVM里面的,那么至少我們現在可以回答的問題了:

SpringBean一定是一個java對象;但是一個Java對象卻不一定是一個SpringBean!

那么我們是不是可以這樣認為,只有被Spring管理的類,才能夠稱之為一個Bean,其他的都稱之為對象!那么Spring是如何將一個類從一個普通的類轉換為一個Spring Bean的呢?他究竟是經過了哪些步驟呢?我們一起探究一下!

二、Spring生命周期的大膽猜測

這里分享一個閱讀源碼的小技巧:捉大放小,連蒙帶猜!8字真言,我們在閱讀源碼過程中,因為你要知道,每一個被開源出來的優秀框架,其源碼的體系都是極其龐大復雜的,我們不能面面俱到,所以在看源碼過程中一定不能被細枝末節纏住,一定要先理清楚整個框架的一個大致思想和大致的框架體系,再去搞那些細枝末節,其效率會好很多,其次在看源碼過程中,我們一定要大膽的去想,去猜測,如果這個功能讓你自己去寫,你會怎么實現!

我們今天學習SpringBean的生命周期也是按照這個8字真言去學習,通過我們之前所學,Spring大致有以下的功能:

  • 他會幫我們自動的創建對象然后保存起來!
  • 他會幫我們完成屬性的填充!
  • 如果我們設置了Aop的功能,他會幫我們自動的代理,實現切面功能!
  • 我們從平常的使用中,至少可以得知以上的三點,如果讓你自己去實現,必會如何實現呢?

    • 首先他既然能夠幫我們自己創建對象,那么他肯定是通過反射來創建的,通過反射來創建,就必定繞不過去要使用Class對象創建,那么我們如何獲取Class對象呢? 去掃描項目,將指定的包下的加了注解的類文件切割獲取Class名稱,通過反射加載Class名稱,反射創建java對象!
    • 我們要完成屬性的填充,為了方便和性能方面,我肯定會把這些創建好的對象保存起來,無疑Map容器是最合適的!
    • 我們在創建一個對象完成之后,反射拿到里面的屬性,如果需要填充,我們先去我們之前保存的容器里面去取,取不出來在反射吧這個依賴的屬性創建出來,然后填充進對象再保存在容器里面,從而完成了屬性的注入!
    • 填充完成屬性之后,我們那當前對象,取與Aop邏輯進行對比,判斷是否需要代理,不需要則創建完成,保存進Map容器,需要代理則對當前這個類進行jdk或者cglib的代理然后再保存進容器里面!

    于是乎,我們自己實現了一個Spring管理一個Bean的所有過程,畫個圖,他大概長這樣!

    自己實現看起來,整個流程就很清晰,掃描、創建、注入、代理、保存一應俱全,但是Spring的實現方式遠比我們自己實現的要復雜的多得多!

    三、Spring的生命周期流程

    Spring作者希望,Spring再著手管理一個Bean的時候,它希望能夠讓Spring的使用者能夠插手,Spring把一個類對象變成一個Java Object的每一步,怎么理解呢?

    比如我們買了一棟新房子,這個房子需要取裝修,你自己去裝修誠然不夠專業,不能夠面面俱到,所以是我們就找了一個裝修公司幫助我們裝修新房,于是裝修公司就開始預先畫好的圖紙進行裝修,但是在裝修的過程中,你為了讓自己的新家更加溫馨,你想掛一些壁畫在墻上,但是圖紙上卻沒有!于是你就找裝修公司,要求裝修公司在新家的墻上掛上一些壁畫!裝修公司在接受到你的請求之后,就吩咐裝修的工人在圖紙之外去給你在墻上掛上壁畫之后,然后再接著裝修!

    上面這個小故事有 這樣幾個角色,我們把它和Spring對照起來!

    • 你:代表框架的使用者!
    • 新房:代表一個Class文件,你自己也能夠裝修,但是不夠專業,所以交給裝修公司! 那么你自己創建對象可能某些使用用起來很麻煩,所以我們交給了Spring容器!
    • 裝修公司:代表著Spring容器!
    • 圖紙:代表預設步驟,Spring原本就存在的步驟!
    • 工人:Spring提供的各種接口!我們可以通過Spring工廠提供的接口做各種自定義的配置!

    上面的小故事,大致可以描述Spring生命周期的核心思想!Spring再對一個Class文件實例化成具體的Spring Bean的時候,它提供了各種接口,由我們自己實現!然后再實例化過程中,不同的時機,去調用不同的接口!從而完成Spring的整個生命周期的創建!

    Spring的生命周期大致分為以下部分!

  • 掃描項目,將項目指定目錄下的Class文件轉換為Class對象!
  • 讀取Class對象屬性包裝為BeanDefinition,然后保存在一個Map中!(不難理解,他是為了后續創建或者讀取這個類的信息更加方便取而創立的)
  • 將全部的類轉化為 BeanDefinition 并保存之后,開始調用第一個回調接口BeanFactoryPostProcessor#postProcessBeanFactory()!它的調用時機是將掃描到的Class文件轉換為 BeanDefinition 之后調用的,我們可以通過回調的方法獲取所有的BeanDefinition ,而后續的所有對Class的操作都是基于BeanDefinition 操作的,所以,我們可以通過修改它,來改變后續的流程!
  • 先從當前的容器對象取當前要創建的對象,當取出來的對象為null時開始著手創建對象!
  • 做一系列的驗證,比如驗證這個類是否被排除、是否正在創建中、是否有依賴Bean【@DependsOn】注解、是否時單例等等!
  • 驗證通過之后,開始通過反射創建這個對象!
  • 合并BeanDefinition ,這里涉及到Spring之前版本使用的父子容器的概念,屬于另外一個知識點不做講解!
  • 判斷當前對象是不是單例、是不是支持循環引用、是不是正在創建等!
  • 執行第二個接口回調InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()方法!它的執行時機時實例化完成之后,屬性填充之前,它的返回值是一個布爾值,當返回false時,不做自動屬性填充!
  • 執行第三個接口回調InstantiationAwareBeanPostProcessor#postProcessProperties()方法!
  • * **他的執行時機是,實例化之后,屬性填充檢查之后,屬性填充之前!它會返回一個屬性,后續的屬性填充會使用這個方法返回的值!我們可以在這個方法里面修改對應Bean的注入的值!**
  • 填充屬性到對象!
  • 調用第四個回調接口BeanNameAware#setBeanName()方法!
  • * **調用時機:屬性填充給完畢后,調用初始化方法之前;它的功能是能獲取bean的Name!**
  • 調用第五個回調接口BeanClassLoaderAware#setBeanClassLoader()
  • * **調用時機:`BeanNameAware`之后,他的功能是傳入bean的類加載器;**
  • 調用第六個回調接口BeanFactoryAware#setBeanFactory()!
  • * **調用時機:`BeanClassLoaderAware`之后,用于設置beanFactory!**
  • 調用第七個回調接口BeanPostProcessor#postProcessBeforeInitialization()方法
  • * **調用時機是部分`Aware`之后,初始化方法之前!傳入當前實例化好的對象和beanName,再初始化前做修改!**
  • 回調第八個比較重要的生命周期的初始化方法,它可以是一個InitializingBean接口的bean,也可以是xml中配置的類,也可以是被加了@PostConstruct注解的方法!
  • * **該方法內部邏輯可以用戶自己編寫,調用時機為:實例化完成之后調用!**
  • 回調第九個回調接口 BeanPostProcessor#postProcessAfterInitialization()方法!
  • * **該方法的調用時機為初始化方法執行之后,這里也是Bean實例化后的最后一步,也是SpringAop實現的重要的一步!**
  • 注冊銷毀方法,以便Spring容器銷毀的時候進行方法的銷毀!
  • 整體的方法流程示例圖如下:

    四、對應源碼結構圖

    最后

    大家看完有什么不懂的可以在下方留言討論.
    謝謝你的觀看。
    覺得文章對你有幫助的話記得關注我點個贊支持一下!

    作者:螺旋升天
    鏈接:https://juejin.im/post/6875847345121001486

    總結

    以上是生活随笔為你收集整理的java创建子类对象的步骤_一通Spring骚操作:我敢说没人比我更懂Java对象创建的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。