中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring源碼之BeanDefinition類是什么

發布時間:2020-10-29 11:07:16 來源:億速云 閱讀:218 作者:小新 欄目:編程語言

這篇文章主要介紹了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的定義和描述,具體概述如下:

屬性行為解釋
parentNameString getParentName();
void setParentName(@Nullable String parentName);
bean定義對象的父類定義對象名稱
beanClassNameString getBeanClassName();
void setBeanClassName(@Nullable String beanClassName);
bean對象的實際class類
scopeString getScope();
void setScope(@Nullable String scope);
bean對象是否為單例<singleton或者prototype>
lazyInitboolean isLazyInit();
void setLazyInit(boolean lazyInit);
是否懶加載
dependsOnString[] getDependsOn();
void setDependsOn(@Nullable String... dependsOn);
設置依賴的bean對象,被依賴的bean對象總是會比當前bean對象先創建
autowireCandidateboolean isAutowireCandidate();
void setAutowireCandidate(boolean autowireCandidate);
設置是否可以自動注入。只對@Autowired注解有效,配置文件中可以通過property顯示注入
primaryboolean isPrimary();
void setPrimary(boolean primary);
配置bean為主要候選bean。當同一個接口的多個實現類或者一個類多次注入到spring容器時,通過該屬性來配置某個bean為主候選bean,通過類型來注入時,默認為使用主候選bean注入
factoryBeanNameString getFactoryBeanName();
void setFactoryBeanName(@Nullable String factoryBeanName);
設置創建bean的工廠名稱
factoryMethodNameString getFactoryMethodName();
void setFactoryMethodName(@Nullable String factoryMethodName);
設置創建bean的工廠中,創建bean的具體方法
initMethodNameString getInitMethodName();
void setInitMethodName(@Nullable String initMethodName);
設置創建bean時,默認初始化的方法
destroyMethodNameString getDestroyMethodName();
void setDestroyMethodName(@Nullable String destroyMethodName);
設置銷毀bean時調用的方法名稱。注意需要調用context的close()方法才會調用
roleint getRole();
void setRole(int role);
設置bean的分類
descriptionString 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類是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

当涂县| 吴旗县| 崇州市| 大渡口区| 永康市| 九龙城区| 平利县| 繁昌县| 大同市| 修文县| 海伦市| 庆阳市| 东光县| 新化县| 博湖县| 廉江市| 怀化市| 云阳县| 普定县| 永善县| 永年县| 准格尔旗| 利川市| 方城县| 大英县| 灵宝市| 固镇县| 霍州市| 观塘区| 商水县| 库伦旗| 丁青县| 京山县| 航空| 西华县| 武乡县| 天柱县| 三河市| 凤山县| 武山县| 沈丘县|