您好,登錄后才能下訂單哦!
這篇文章主要介紹了Spring源碼之BeanDefinition類是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
Spring版本為5.1.5
用過spring的人都知道,我們將對象注入到spring容器中,交給spring來幫我們管理。這種對象我們稱之為bean對象。但是這些bean對象在spring容器中,到底是以什么形式存在,具有哪些屬性、行為呢?今天我們進入到spring源碼來一探究竟。
bean的創建工廠BeanFactory有個默認實現類DefaultListableBeanFactory,內部有個存放所有注入bean對象信息的Map
/** Map of bean definition objects, keyed by bean name. */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
Map的value對象BeanDefinition就是spring中對bean的定義和描述,具體概述如下:
屬性 | 行為 | 解釋 |
---|---|---|
parentName | String getParentName(); void setParentName(@Nullable String parentName); | bean定義對象的父類定義對象名稱 |
beanClassName | String getBeanClassName(); void setBeanClassName(@Nullable String beanClassName); | bean對象的實際class類 |
scope | String getScope(); void setScope(@Nullable String scope); | bean對象是否為單例<singleton或者prototype> |
lazyInit | boolean isLazyInit(); void setLazyInit(boolean lazyInit); | 是否懶加載 |
dependsOn | String[] getDependsOn(); void setDependsOn(@Nullable String... dependsOn); | 設置依賴的bean對象,被依賴的bean對象總是會比當前bean對象先創建 |
autowireCandidate | boolean isAutowireCandidate(); void setAutowireCandidate(boolean autowireCandidate); | 設置是否可以自動注入。只對@Autowired注解有效,配置文件中可以通過property顯示注入 |
primary | boolean isPrimary(); void setPrimary(boolean primary); | 配置bean為主要候選bean。當同一個接口的多個實現類或者一個類多次注入到spring容器時,通過該屬性來配置某個bean為主候選bean,通過類型來注入時,默認為使用主候選bean注入 |
factoryBeanName | String getFactoryBeanName(); void setFactoryBeanName(@Nullable String factoryBeanName); | 設置創建bean的工廠名稱 |
factoryMethodName | String getFactoryMethodName(); void setFactoryMethodName(@Nullable String factoryMethodName); | 設置創建bean的工廠中,創建bean的具體方法 |
initMethodName | String getInitMethodName(); void setInitMethodName(@Nullable String initMethodName); | 設置創建bean時,默認初始化的方法 |
destroyMethodName | String getDestroyMethodName(); void setDestroyMethodName(@Nullable String destroyMethodName); | 設置銷毀bean時調用的方法名稱。注意需要調用context的close()方法才會調用 |
role | int getRole(); void setRole(int role); | 設置bean的分類 |
description | String getDescription(); void setDescription(@Nullable String description); | 對bean對象的描述 |
注意:BeanDefinition是一個接口,內部只定義了bean對象的一些基本行為。上表中的屬性在BeanDefinition中并不是真實存在的,只是通過set、get方法來設置和獲取。以下抽取出部分BeanDefinition源代碼供大家感知下
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { /** * Override the target scope of this bean, specifying a new scope name. * @see #SCOPE_SINGLETON * @see #SCOPE_PROTOTYPE */ void setScope(@Nullable String scope); /** * Return the name of the current target scope for this bean, * or {@code null} if not known yet. */ @Nullable String getScope(); }
假設有以下兩個bean,Java代碼如下
MyTestBean
package com.yuanweiquan.learn.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Description; public class MyTestBean { @Autowired private AutowireCandidateBean autowireCandidateBean; public void init() { System.out.println("inti MyTestBean"); } public AutowireCandidateBean getAutowireCandidateBean() { return autowireCandidateBean; } public void setAutowireCandidateBean(AutowireCandidateBean bean) { this.autowireCandidateBean = bean; } }
AutowireCandidateBean
package com.yuanweiquan.learn.bean; public class AutowireCandidateBean { public void initBean() { System.out.println("init AutowireCandidateBean"); } public void destroyBean() { System.out.println("destroy AutowireCandidateBean"); } }
下面看如何在配置文件applicationContext.xml來進行配置
<bean id="myTestBean" class="com.yuanweiquan.learn.bean.MyTestBean" depends-on="autowireCandidateBean" init-method="init"/> <bean id="autowireCandidateBean" class="com.yuanweiquan.learn.bean.AutowireCandidateBean" init-method="initBean" autowire-candidate="true" destroy-method="destroyBean" scope="singleton" parent="myTestBean" lazy-init="default" primary="true"> <description>autowireCandidateBean description</description> </bean>
接下來就是測試代碼
FileSystemXmlApplicationContext factory = new FileSystemXmlApplicationContext("classpath:applicationContext.xml"); BeanDefinition myTestBeanDefinition = factory.getBeanFactory().getBeanDefinition("autowireCandidateBean"); //輸出 System.out.println("bean description:" + myTestBeanDefinition.getDescription()); System.out.println("bean class name:" + myTestBeanDefinition.getBeanClassName()); System.out.println("parent name:" + myTestBeanDefinition.getParentName()); System.out.println("scope:" + myTestBeanDefinition.getScope()); System.out.println("is lazyinit:" + myTestBeanDefinition.isLazyInit()); System.out.println("depends On:" + myTestBeanDefinition.getDependsOn()); System.out.println("is autowireCandidate:" + myTestBeanDefinition.isAutowireCandidate()); System.out.println("is primary:" + myTestBeanDefinition.isPrimary()); System.out.println("factory bean name:"+myTestBeanDefinition.getFactoryBeanName()); System.out.println("factory bean method name:" + myTestBeanDefinition.getFactoryMethodName()); System.out.println("init method name:" + myTestBeanDefinition.getInitMethodName()); System.out.println("destory method name:" + myTestBeanDefinition.getDestroyMethodName()); System.out.println("role:" + myTestBeanDefinition.getRole()); //關閉context,否則不會調用bean的銷毀方法 factory.close();
控制臺輸出如下
init AutowireCandidateBean inti MyTestBean bean description:autowireCandidateBean description bean class name:com.yuanweiquan.learn.bean.AutowireCandidateBean parent name:myTestBean scope:singleton is lazyinit:false depends On:null is autowireCandidate:true is primary:true factory bean name:null factory bean method name:null init method name:initBean destory method name:destroyBean role:0 destroy AutowireCandidateBean
感謝你能夠認真閱讀完這篇文章,希望小編分享Spring源碼之BeanDefinition類是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。