Spring原始碼學習IOC(7):淺析aware相關介面
spring中 有一大堆Aware結尾介面, 例如BeanFactoryAware, ApplicationContextAware, ServletContextAware等
在程式中 我們自定義的bean實現了 Aware相關介面 spring 通過回撥 就可以獲得一些資源
比如說 我們的bean實現BeanFactoryAware spring會在bean例項化(getBean)階段 回撥該setBeanFactory方法 注入BeanFactory例項(也就是this)
spring BeanFactoryAware 介面定義
[java]- publicinterface BeanFactoryAware {
- void setBeanFactory(BeanFactory beanFactory) throws BeansException;
- }
spring容器中的bean 例項化 是在AbstractBeanFactory getBean中發生
[java] view plaincopyprint?-
public Object getBean(String name, Class requiredType, Object[] args)
- return doGetBean(name, requiredType, args, false);
- }
呼叫的 doGetBean 方法比較複雜 簡單看看 建立單例這段
[java] view plaincopyprint?- protected Object doGetBean(
-
final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
- final String beanName = transformedBeanName(name);
- .................略 // Create bean instance.
- //bean的定義是不是單例
- if (mbd.isSingleton()) {
- sharedInstance = getSingleton(beanName, new ObjectFactory() {
- public Object getObject() throws BeansException {
- try {
- // 是一個抽象方法 在子類AbstractAutowireCapableBeanFactory中實現
- return createBean(beanName, mbd, args);
- }
- catch (BeansException ex) {
- destroySingleton(beanName);
- throw ex;
- }
- }
- });
- bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
- }
- .................略
- return bean;
- }
AbstractAutowireCapableBeanFactory createBean方法
[java] view plaincopyprint?- protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
- throws BeanCreationException {
- AccessControlContext acc = AccessController.getContext();
- return AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- .................略
- //關注doCreateBean方法
- Object beanInstance = doCreateBean(beanName, mbd, args);
- if (logger.isDebugEnabled()) {
- logger.debug("Finished creating instance of bean '" + beanName + "'");
- }
- return beanInstance;
- }
- }, acc);
- }
doCreateBean方法
[java] view plaincopyprint?- protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
- // Instantiate the bean.
- BeanWrapper instanceWrapper = null;
- if (mbd.isSingleton()) {
- instanceWrapper = (BeanWrapper) this.factoryBeanInstanceCache.remove(beanName);
- }
- .................略
- // Initialize the bean instance.
- Object exposedObject = bean;
- try {
- populateBean(beanName, mbd, instanceWrapper);
- //實現 *Aware部分介面, InitializingBean介面 方法呼叫在此發生
- exposedObject = initializeBean(beanName, exposedObject, mbd);
- }
- catch (Throwable ex) {
- if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
- throw (BeanCreationException) ex;
- }
- else {
- thrownew BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
- }
- }
- .................略
- return exposedObject;
- }
initializeBean方法
[java] view plaincopyprint?- protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {
- if (bean instanceof BeanNameAware) {
- ((BeanNameAware) bean).setBeanName(beanName);
- }
- if (bean instanceof BeanClassLoaderAware) {
- ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
- }
- // 如果當前bean 是BeanFactoryAware的一個例項
- if (bean instanceof BeanFactoryAware) {
- //回調當前例項注入資源
- ((BeanFactoryAware) bean).setBeanFactory(this);
- }
- Object wrappedBean = bean;
- if (mbd == null || !mbd.isSynthetic()) {
- //BeanPostProcessor 介面 postProcessBeforeInitialization方法回撥
- wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
- }
- try {
- // 實現InitializingBean介面 afterPropertiesSet方法呼叫
- invokeInitMethods(beanName, wrappedBean, mbd);
- }
- catch (Throwable ex) {
- thrownew BeanCreationException(
- (mbd != null ? mbd.getResourceDescription() : null),
- beanName, "Invocation of init method failed", ex);
- }
- if (mbd == null || !mbd.isSynthetic()) {
- wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
- }
- return wrappedBean;
- }
Spring aware相關介面
相關推薦
Spring原始碼學習IOC(7):淺析aware相關介面
spring中 有一大堆Aware結尾介面, 例如BeanFactoryAware, ApplicationContextAware, ServletContextAware等 在程式中 我們自定義的bean實現了 Aware相關介面 spring 通過回撥
spring原始碼學習之路---IOC容器初始化要義之bean定義載入(四)
上章說到要帶各位去看看bean定義載入的要義,其實就是loadBeanDefinitions這個方法的具體實現步驟,下面我們跟隨這個方法去看下它到底是如何載入bean定義的。 上面是我擷取的實現了loadBeanDefinitions的類級別截圖,loadBeanDefinit
spring原始碼學習之路---深度分析IOC容器初始化過程(三)
分析FileSystemXmlApplicationContext的建構函式,到底都做了什麼,導致IOC容器初始化成功。 public FileSystemXmlApplicationContext(String[] configLocations, boolean ref
spring原始碼學習之路---IOC實現原理(二)
上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的bean定義介面,上章提到說我們無法讓BeanFactory持有一個Map package org.springframework.beans.factory.supp
spring原始碼學習之路---IOC初探(一)
首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解
白話Spring原始碼(八):Aware介面
我們知道spring框架中所有bean都是在工廠裡建立的,bean對自己是“無知覺”的,不知道自己叫什麼名字(bean的id或者name),從哪裡來(哪個工廠建立)。 一、為什麼需要Aware 大家看過黑客帝國電影吧,黑客帝國中機械工廠裡面“養殖”的人類,他們雖然能完成一定的功能,但是根本不
學習Mybatis(7):Mybatis執行原理原始碼分析
Mybatis執行主要有三步: 1)建立SqlSessionFactory工廠物件 一般使用的方法是使用SqlSessionFactoryBuilder生成器的build方法載入配置檔案生成: SqlSessionFactory sqlSessionFactory=new SqlSess
Spring原始碼學習之IOC實現原理(二)-ApplicationContext
一.Spring核心元件結構 總的來說Spring共有三個核心元件,分別為Core,Context,Bean.三大核心元件的協同工作主要表現在 :Bean是包裝我們應用程式自定義物件Object的,Object中存有資料,而Context就是為了這些資料存放提供一個生存環境,儲存各個 bean之間的
Spring原始碼學習之IOC容器實現原理(一)-DefaultListableBeanFactory
從這個繼承體系結構圖來看,我們可以發現DefaultListableBeanFactory是第一個非抽象類,非介面類。實際IOC容器。所以這篇部落格以DefaultListableBeanFactoryIOC容器為基準進行IOC原理解析。 一.兩個重要介面 前面已經分析了BeanFactor,它的三個直接子
Spring原始碼學習--Spring中IOC和AOP的介紹
前言: 控制反轉(Inversion of Control,英文縮寫為IoC); 面向切面程式設計(Aspect Oriented Programming,英文縮寫為AOP) 我們是在使用spring框架的過程中,很大一部分是為了使用IoC(依賴注入),和
Spring原始碼學習之路---IOC實現原理(三)
原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/8548478 上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的be
Spring原始碼學習01:IntelliJ IDEA2019.3編譯Spring5.3.x原始碼
目錄 Spring原始碼學習01:IntelliJ IDEA2019.3編譯Spring5.3.x原始碼 前言 工欲善其事必先利其器。學習和深讀Spring原始碼一個重要的前提:編譯原始碼到我們的本地環境。這樣方便我們在本地環境添加註釋、斷點追蹤、檢視類或介面的繼承關係等等,更加高效的學習Spring原始
Spring 原始碼學習 04:初始化容器與 DefaultListableBeanFactory
#### 前言 ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/Sf8fRH-D6nt5n.png) 在前一篇文章:[建立 IoC 容器的幾種方式](https://mp.weixin.qq.com/s/V7SjmIFKAXyppBF_
sqlite學習筆記7:C語言中使用sqlite之打開數據庫
實例 clas details code 返回 pri san filename stdlib.h 數據庫的基本內容前面都已經說得差點兒相同了。接下看看如何在C語言中使用sqlite。 一 接口 sqlite3_open(const char *filename, s
hibernate框架學習筆記7:HQL查詢、Criteria查詢
import res ber return org close 返回 closed 所有 HQL查詢:hibernate獨有的查詢語言 適用於不復雜的多表查詢 示例: 實體類: package domain; public class Customer {
struts2框架學習筆記7:struts2標簽
put 取值 div private sub pan 不常用 筆記 textarea 三大標簽: 1.JSP:腳本,為了替代servlet,已過時 2.JSTL:標準標簽庫(core、format、sql、xml),還未淘汰的只有core庫 3.Struts2標簽庫:由S
spring框架學習筆記4:SpringAOP實現原理
odin 就是 sets 使用 point 攔截 ceo oca ssl AOP AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入
Kali學習筆記7:SHODAN搜索引擎
isp Go 6.2 www. image try 域名 主機 httpd SHODAN搜索引擎不像百度谷歌等,它們爬取的是網頁,而SHODAN搜索的是設備。 物聯網使用過程中,通常容易出現安全問題,如果被黑客用SHODAN搜索到,後果不堪設想。 網站:https://
Spring Boot學習筆記之一:傳統maven項目與采用spring boot項目區別
bubuko xml文件 分享 lda ring info 插件 eclips web 項目結構區別 傳統的maven構建的項目結構如下: 用maven構建的采用springboot項目結構如下: 二者結構一致,區別如下:傳統項目如果需要打成war包,需要在WEB-IN
spring原始碼學習(5.1.0版本)——Bean的初始化(中)
目錄 前言 createBean 有自定義TargetSource代理類的生成 resolveBeforeInstantiation applyBeanPostProcessorsBeforeInstantiation postProcessBeforeIn