SpringBeanDefinition詳解

在Spring框架中,Bean是重要的資源,每個Bean在容器中都應該有一個對應的BeanDefinition對象,它是Spring中定義和封裝Bean配置元數據的中心描述符。BeanDefinition對象是Spring中IoC容器創建、裝配和管理Bean的核心類,掌握BeanDefinition及其相關的屬性和方法,有助於深入理解Spring框架的設計思想和核心功能。

一、獲取BeanDefinition對象

在Spring框架中,獲取BeanDefinition對象常見的方式有三種:

1、使用BeanFactory接口或ApplicationContext接口中的getBeanDefinition方法獲取指定Bean的BeanDefinition對象;

BeanDefinition bd = factory.getBeanDefinition("beanName"); //通過Bean名稱獲取BeanDefinition
BeanDefinition bd = factory.getBeanDefinition(BeanClass.class); //通過Bean類型獲取BeanDefinition

2、使用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等XmlApplicationContext實現類創建Spring容器,通過BeanDefinitionReader或BeanDefinitionParser解析讀取xml中的配置信息,然後生成BeanDefinition對象;

@Bean
public BeanDefinitionReader beanDefinitionReader() throws Exception {
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory());
    reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));
    return reader;
}

3、通過BeanDefinitionBuilder創建和修改BeanDefinition對象。

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.addPropertyValue("propertyName", "propertyValue");
builder.setScope(BeanDefinition.SCOPE_SINGLETON);
BeanDefinition bd = builder.getBeanDefinition();

二、Bean的作用域

在Spring框架中,Bean通過Scope屬性來定義Bean的作用域,Spring框架提供了以下五種作用域:

1、singleton:單例模式,容器中只存在一個Bean實例,默認作用域;

2、prototype:原型模式,每次請求Bean時,都會創建一個新的Bean實例;

3、request:針對Web應用,每個Http請求都會創建一個新的Bean實例;

4、session:針對Web應用,每個Http Session會創建一個新的Bean實例;

5、globalSession:針對Web應用,全局Http Session會創建一個新的Bean實例。

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.setScope(BeanDefinition.SCOPE_PROTOTYPE);
BeanDefinition bd = builder.getBeanDefinition();

三、Bean的聲明周期

在Spring框架中,Bean生命周期可以被分為以下七個階段:

1、實例化Bean:Spring容器根據BeanDefinition的配置信息創建一個Bean實例;

2、設置對象屬性:Spring容器根據BeanDefinition的配置信息將屬性或引用注入到Bean中;

3、調用BeanPostProcessor的postProcessBeforeInitialization()方法:BeanPostProcessor是Spring框架提供的接口,用於對Bean進行初始化前後的處理工作;

4、調用InitializingBean接口的afterPropertiesSet()方法或者在xml文件中配置init-method方法:該方法在Bean的所有屬性被設置之後調用,完成其他的初始化工作;

5、調用BeanPostProcessor的postProcessAfterInitialization()方法:如果這個Bean是SmartInitializingSingleton或者SmartLifecycle接口的實現類並且被註冊了,直接進入第七步;

6、Bean可以使用了:Bean正在工作當中;

7、調用SmartLifecycle的start()方法或SmartInitializingSingleton的afterSingletonsInstantiated()方法:如果Bean實現了SmartLifecycle接口,那麼在Spring啟動時,自動調用start()方法使Bean處於運行狀態;如果Bean實現了SmartInitializingSingleton接口,那麼在所有Bean都初始化完成後,調用afterSingletonsInstantiated()方法。

@Component
public class ExampleBean implements InitializingBean, DisposableBean, SmartInitializingSingleton, SmartLifecycle {
    //...
    @Override
    public void afterSingletonsInstantiated() {
        log.info("Executing afterSingletonsInstantiated()");
    }
    @Override
    public void start() {
        log.info("Executing start()");
    }
    //...
}

四、Bean的依賴關係

Spring框架中,Bean之間的依賴關係通常通過BeanDefinition對象中的DependsOn屬性、@Autowired註解和@Resource註解來完善。

1、DependsOn屬性:用於強制提前初始化特定Bean依賴的Bean;

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.getBeanDefinition().setDependsOn(new String[]{"dependentBean"});

2、@Autowired註解:將其他Bean作為屬性注入到當前Bean中,以創建依賴關係;

@Component
public class ExampleBean {
    @Autowired
    private OtherBean otherBean;
    //...
}

3、@Resource註解:類似@Autowired註解,用於將其他Bean作為屬性注入到當前Bean中,可以指定Bean的名稱或者類型。

@Component
public class ExampleBean {
    @Resource(name = "otherBean")
    private OtherBean otherBean;
    //...
}

五、Bean的元數據

Spring框架中,Bean元數據是指Bean的詳細描述信息,包括Bean的類名、作用域、構造參數、屬性、依賴等。Spring提供了多種方式來定義Bean元數據。

1、xml方式:通過定義xml文檔,在xml元素中聲明Bean元數據;


    

2、JavaConfig方式:使用JavaConfig方式定義Bean元數據,通過@Configuration註解標記JavaConfig類,使用@Bean註解定義Bean;

@Configuration
public class AppConfig {
    @Bean
    public ExampleBean exampleBean(){
        ExampleBean exampleBean = new ExampleBean();
        exampleBean.setPropertyName("propertyValue");
        return exampleBean;
    }
}

六、Bean的後置處理器

在Spring框架中,Bean的後置處理器是指在Bean生命周期中,在Bean屬性注入、Bean初始化前後等階段對Bean進行定製化操作的處理器。Spring框架提供了如下的Bean後置處理器接口:

1、BeanPostProcessor:所有Bean後置處理器都需要實現該接口;

2、InstantiationAwareBeanPostProcessor:繼承BeanPostProcessor接口,用來在Bean實例化前後對Bean進行特殊處理,例如Bean自動裝載、AOP功能實現;

3、BeanFactoryPostProcessor:在BeanFactory容器實例化完成之後,BeanFactoryPostProcessor接口會先於其他Bean被實例化,用於對BeanFactory容器進行post-processing操作。

public class ExampleBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //執行Bean初始化前的操作
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //執行Bean初始化後的操作
        return bean;
    }
}

七、總結

本文詳細介紹了Spring框架中BeanDefinition的相關概念,包括獲取BeanDefinition對象、Bean的作用域、Bean的聲明周期、Bean的依賴關係、Bean的元數據和Bean的後置處理器等。Spring框架通過BeanDefinition對象的封裝和管理,實現對Bean的自動裝配、託管、管理等核心功能,使得Spring框架應用更加簡單、更加靈活、更加高效。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157799.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 20:02
下一篇 2024-11-18 20:02

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25

發表回復

登錄後才能評論