国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring源碼之Bean實例化基本原理

開發 前端
在實例化Bean之前在BeanDefinition里頭已經有了所有需要實例化時用到的元數據,接下來Spring只需要選擇合適的實例化方法以及策略即可。

 [[346085]]

創建Spring Bean實例化是Spring Bean生命周期的第一階段

Bean的生命周期主要有如下幾個步驟:

「詳細介紹:Spring In Action是這樣講的:」

  • 實例化Bean對象,這個時候Bean的對象是非常低級的,基本不能夠被我們使用,因為連最基本的屬性都沒有設置,可以理解為連Autowired注解都是沒有解析的;
  • 填充屬性,當做完這一步,Bean對象基本是完整的了,可以理解為Autowired注解已經解析完畢,依賴注入完成了;
  • 如果Bean實現了BeanNameAware接口,則調用setBeanName方法;
  • 如果Bean實現了BeanClassLoaderAware接口,則調用setBeanClassLoader方法;
  • 如果Bean實現了BeanFactoryAware接口,則調用setBeanFactory方法;
  • 調用BeanPostProcessor的postProcessBeforeInitialization方法;
  • 如果Bean實現了InitializingBean接口,調用afterPropertiesSet方法;
  • 如果Bean定義了init-method方法,則調用Bean的init-method方法;
  • 調用BeanPostProcessor的postProcessAfterInitialization方法;當進行到這一步,Bean已經被準備就緒了,一直停留在應用的上下文中,直到被銷毀;
  • 如果應用的上下文被銷毀了,如果Bean實現了DisposableBean接口,則調用destroy方法,如果Bean定義了destory-method聲明了銷毀方法也會被調用。

在實例化Bean之前在BeanDefinition里頭已經有了所有需要實例化時用到的元數據,接下來Spring只需要選擇合適的實例化方法以及策略即可。

「BeanDefinition」

Spring容器啟動的時候會定位我們的配置文件,加載文件,并解析成Bean的定義文件BeanDefinition

右邊的Map里存儲這bean之間的依賴關系的定義BeanDefinition,比如OrderController依賴OrderService這種

實例化方法有兩大類分別是工廠方法和構造方法實例化,后者是最常見的。其中Spring默認的實例化方法就是無參構造函數實例化。

如我們在xml里定義的以及用注解標識的bean都是通過默認實例化方法實例化的

實例化方法

「使靜態工廠方法實例化」

  1. public class FactoryInstance { 
  2.  
  3.     public FactoryInstance() { 
  4.         System.out.println("instance by FactoryInstance"); 
  5.     } 
  1. public class MyBeanFactory { 
  2.  
  3.     public static FactoryInstance getInstanceStatic(){ 
  4.         return new FactoryInstance(); 
  5.     } 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
  5.  
  6.     <bean id="factoryInstance" class="spring.service.instance.MyBeanFactory"  
  7.           factory-method="getInstanceStatic"/> 
  8. </beans> 

「使用實例工廠方法實例化」

  1. public class MyBeanFactory { 
  2.  
  3.     /** 
  4.      * 實例工廠創建bean實例 
  5.      * 
  6.      * @return 
  7.      */ 
  8.     public FactoryInstance getInstance() { 
  9.         return new FactoryInstance(); 
  10.     } 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
  5.     <!-- 工廠實例 -- >     
  6.     <bean id="myBeanFactory" class="MyBeanFactory"/>  
  7.     <bean id="factoryInstance" factory-bean="myBeanFactory" factory-method="getInstance"/>  
  8. </beans>  

「使用無參構造函數實例化(默認的)」

  1. public class ConstructorInstance { 
  2.  
  3.     public ConstructorInstance() { 
  4.         System.out.println("ConstructorInstance none args"); 
  5.     } 
  6.  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
  5.     <bean id="constructorInstance" class="spring.service.instance.ConstructorInstance"/> 
  6. </beans> 

「使用有參構造函數實例化」

  1. public class ConstructorInstance { 
  2.  
  3.     private String name
  4.      
  5.     public ConstructorInstance(String name) { 
  6.         System.out.println("ConstructorInstance with args"); 
  7.         this.name = name
  8.     } 
  9.  
  10.     public String getName() { 
  11.         return name
  12.     } 
  13.  
  14.     public void setName(String name) { 
  15.         this.name = name
  16.     } 
  17.  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
  5.         
  6.    <bean id="constructorInstance" class="spring.service.instance.ConstructorInstance"
  7.         <constructor-arg index="0" name="name" value="test constructor with args"/> 
  8.     </bean> 
  9. </beans> 

源碼閱讀

直接來看看doCreateBean方法

具體實現在AbstractAutowireCapableBeanFactory類里面。

我們這里只需關注第一步創建bean實例的流程即可

  1. instanceWrapper = createBeanInstance(beanName, mbd, args); 

上面代碼就是spring 實現bean實例創建的核心代碼。這一步主要根據BeanDefinition里的元數據定義決定使用哪種實例化方法,主要有下面三種:

  • instantiateUsingFactoryMethod 工廠方法實例化的具體實現
  • autowireConstructor 有參構造函數實例化的具體實現
  • instantiateBean 默認實例化具體實現(無參構造函數)

「實例化策略(cglib or 反射)」

❝工廠方法的實例化手段沒有選擇策略直接用了反射實現的,所以這個實例化策略都是對于構造函數實例化而言的❞

下面選一個instantiateBean的實現來介紹


 

 

上面說到的兩構造函數實例化方法不管是哪一種都會選一個實例化策略進行,到底選哪一種策略也是根據BeanDefinition里的定義決定的。

下面這一行代碼就是選擇實例化策略的代碼

  1. beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent); 

「選擇使用反射還是cglib」

 

先判斷如果beanDefinition.getMethodOverrides()為空也就是用戶沒有使用replace或者lookup的配置方法,那么直接使用反射的方式,簡單快捷

但是如果使用了這兩個特性,在直接使用反射的方式創建實例就不妥了,因為需要將這兩個配置提供的功能切入進去,所以就必須要使用動態代理的方式將包含兩個特性所對應的邏輯的攔截增強器設置進去,這樣才可以保證在調用方法的時候會被相應的攔截器增強,返回值為包含攔截器的代理實例-----Spring源碼深度解析

  1. <bean id="constructorInstance" class="spring.service.instance.ConstructorInstance" > 
  2.         <lookup-method name="getName" bean="xxx"/> 
  3.         <replaced-method name="getName" replacer="yyy"/> 
  4.     </bean> 

如果使用了lookup或者replaced的配置的話會使用cglib,否則直接使用反射。

  1. public static final String LOOKUP_METHOD_ELEMENT = "lookup-method"
  2.  
  3. public static final String REPLACED_METHOD_ELEMENT = "replaced-method"

覺得不錯,點個贊再走吧,謝謝

參考:

Spring源碼深度解析

Spring In Action

 

https://url.ms/owy8p

本文轉載自微信公眾號「月伴飛魚」,可以通過以下二維碼關注。轉載本文請聯系月伴飛魚公眾號。

 

責任編輯:武曉燕 來源: 月伴飛魚
相關推薦

2012-01-12 14:37:34

jQuery

2009-02-24 09:43:00

IP電話原理

2011-11-29 12:17:00

2011-08-10 19:33:09

Cocoa對象

2013-04-07 14:09:55

Android應用基本

2016-08-18 00:04:09

網絡爬蟲抓取系統服務器

2010-08-20 13:29:33

OFDM

2019-11-28 10:45:28

ZooKeeper源碼分布式

2020-03-21 14:57:14

手機定位智能手機APP

2016-08-17 23:53:29

網絡爬蟲抓取系統

2021-02-08 21:40:04

SockmapBPF存儲

2009-06-11 09:56:09

MySQL Repli原理

2011-07-07 14:10:21

Cocoa 內省 hash

2020-12-29 16:55:44

ZooKeeper運維數據結構

2010-03-18 20:13:03

Java socket

2010-03-17 13:35:02

2011-07-07 14:46:10

Cocoa Xcode

2019-04-30 08:15:31

2010-06-18 17:28:37

Linux Anacr

2010-01-07 09:53:09

Winform多線程編
點贊
收藏

51CTO技術棧公眾號

精品久久中文| 亚洲色图都市小说| 国产999精品| 快播电影网址老女人久久| 欧美在线不卡视频| 日本私人网站在线观看| 偷拍与自拍一区| 国产无遮挡在线视频免费观看| 99国产精品久久| 精品久久久久久久久久中文字幕| 老司机午夜精品| 亚洲va久久久噜噜噜久久狠狠| 亚洲日本免费| 国内精品久久国产| 国产农村妇女精品一二区| 精品视频一区二区| 亚洲尤物在线| 亚洲一区二区三区乱码| 紧缚捆绑精品一区二区| 欧美日韩激情四射| 91麻豆国产福利在线观看| 激情网站五月天| 亚洲欧洲精品天堂一级| 欧美xx网站| 狠狠躁天天躁日日躁欧美| 国产三级在线看| 日韩视频一区在线观看| 男人天堂视频在线观看| 亚洲日本成人女熟在线观看| 免费在线成人激情电影| 久久久精品中文字幕| 精品福利网址导航| 成人欧美一区二区三区黑人| 欧美午夜在线| 在线综合视频网站| 97久久人人超碰| 国外av网站| 欧美性xxxxxxxx| 国产又色又爽又黄刺激在线视频| 亚洲人成网站999久久久综合| 日韩在线你懂得| 国产精品电影网站| 国产亚洲精品bv在线观看| 亚洲精品久久久一区二区三区 | 99精品在线免费观看| 香蕉久久网站| 午夜精品在线看| 亚洲一区二区久久久| 免费高清在线观看免费| 国产亚洲午夜高清国产拍精品| 视色视频在线观看| 午夜亚洲福利老司机| 久久久久久久久免费视频| 欧美va亚洲va香蕉在线| 亚洲精品v亚洲精品v日韩精品| 成人羞羞国产免费| 老司机精品视频导航| 欧美伦理片在线看| 日本高清无吗v一区| 18video性欧美19sex高清| 九九视频直播综合网| 欧美一区影院| 久久视频这里有精品| 亚洲国产成人高清精品| 欧美性video| 青青久久av北条麻妃黑人| 美女精品在线观看| 一道本视频在线观看| 欧美日韩三级视频| 97se亚洲| 天天综合狠狠精品| 一区二区高清视频在线观看| 91高清视频在线观看| 欧美专区国产专区| 黄一区二区三区| 天堂a√中文在线| 久久在线视频在线| 午夜亚洲影视| 国产乱xxⅹxx国语对白| 亚洲电影av在线| 欧美大片aaaa| 成人在线免费在线观看| 91精品国产入口| 久久99青青| 日本欧美视频在线观看| 91色在线porny| 成人精品一区二区三区免费| 国产精品一二三四五| 亚洲国产欧美日韩| 亚洲人成亚洲精品| 综合操久久久| 在线精品视频免费播放| 国产精品xxx在线观看| 性欧美.com| 疯狂做受xxxx欧美肥白少妇| 欧美黄色一级| 黄色a级在线观看| 欧美日韩精品欧美日韩精品一| 国产一区二区精品福利地址| 丰满少妇久久久| 亚洲国产成人一区| 亚洲综合精品| 成人资源www网在线最新版| 国产成人一区二区三区小说| 91老师国产黑色丝袜在线| 成人国产电影在线观看| 久久久久久久久久码影片| 五月天中文字幕一区二区| 红杏一区二区三区| chinese少妇国语对白| 久久九九全国免费精品观看| 国产一区二区三区av电影| aa在线视频| 欧美极品一区| 欧美精品视频www在线观看| 欧美精品国产| 免费一级在线观看播放网址| 日本久久精品视频| 亚洲视频在线一区观看| 欧美经典影片视频网站| 99精品人妻少妇一区二区| 丝袜美腿亚洲一区二区| 成人妖精视频yjsp地址| 外国电影一区二区| 国产精品www在线观看| 亚洲少妇中文在线| 国产成人在线电影| 中韩乱幕日产无线码一区| 日本a视频在线观看| 色婷婷综合成人av| 久久综合九色综合久久久精品综合| 六九午夜精品视频| 国产无套内射久久久国产| 欧美猛男性生活免费| 欧美激情在线一区二区三区| 欧美美女黄色| 作爱视频免费观看视频在线播放激情网| 国产a∨精品一区二区三区不卡| 亚洲欧美激情视频在线观看一区二区三区 | 久久精品在线视频| 久久麻豆一区二区| 亚洲第一二三区| 永久免费在线| 久中文字幕一区| 亚洲欧美激情一区| 91丨porny丨在线| 猛男gaygay欧美视频| 免费一级在线观看播放网址| 污视频在线免费观看一区二区三区| 亚洲欧美日韩网| 91在线观看下载| 亚洲综合福利| 91精品大全| 吴梦梦av在线| 国语对白做受69| 色婷婷精品久久二区二区蜜臂av | 色综合久久88色综合天天免费| 国内精品久久久久久久影视麻豆| 色大18成网站www在线观看| 亚洲国产欧洲综合997久久| 这里只有精品久久| 亚洲欧美欧美一区二区三区| 国精品一区二区三区| 日日夜夜天天综合| 米奇.777.com| 欧美日韩一区二区视频在线观看| 色播久久人人爽人人爽人人片视av| 国产欧美一区二区在线| 欧美视频福利| 日韩制服诱惑| 欧美著名女优| 综合久久国产| 国产精品三级在线| 日韩精品视频在线观看免费| 亚洲欧洲韩国日本视频| 国产精品尤物| 香蕉成人app| 在线免费观看的av网站| 亚洲中文字幕无码中文字| 91久久久亚洲精品| 中文字幕最新精品| 欧美午夜xxx| www.av精品| 亚洲视频免费| 国产免费区一区二区三视频免费 | 美女三级99| 久久久久久久久电影| 欧美精选一区二区| 国产精品日韩精品欧美在线| 亚洲综合另类| 妖精视频一区二区三区免费观看| 日韩精品分区| 濑亚美莉一二区在线视频| 成人手机在线播放| 97人人香蕉| 96精品视频在线| 亚洲欧美成人一区二区在线电影| 欧美日韩在线免费观看| 91免费看片在线观看| 全国精品久久少妇|