Spring中JavaBean的生命周期及模式

? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ???( 本篇文章大部分講述了是底層知識,理念及原理 )?

? ? ?(?如果只想了解,看我標記的重點即可,如果想明白其中原理,請耐心看完,對你大有受益 )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

目錄

一、簡介

( 1 ) 是什么

( 2 ) 背景概述

( 3 ) 作用

二、生命周期

?2.1 講述

2.2 相關內容

?1) .?BeanDefinitionReader

?2) . BeanDefinition

?3) .?BeanFactoryPostProcessor

?4) . BeanFactory

?5) .?Aware

三、模式

3.1 概述

?單例模式

?多例模式

3.2 演示

給我們帶來什么收獲


一、簡介

( 1 ) 是什么

在Spring框架中,JavaBean的背景可以追溯到Java語言的發展和面向對象編程的原則。JavaBean作為一種特定的編程規范和約定,被引入到Spring框架中,以實現更加靈活和可擴展的開發方式。

在Spring框架中,JavaBean是一個普通的Java類,遵循一些特定的命名和屬性規范。一個JavaBean類必須具備以下特征:

  • 1. 私有的成員變量:JavaBean類中的屬性通常是私有的,以保護數據,同時提供公共的getter和setter方法來訪問和修改屬性的值。
  • 2. 無參構造方法:JavaByouean類必須提供一個無參構造方法,用于實例化該類的對象。
  • 3. 可序列化:JavaBean類可以實現Serializable接口,以便在網絡傳輸或持久化時能夠將對象轉換為字節流。這樣,在分布式環境下,可以方便地傳輸JavaBean對象。

JavaBean在Spring框架中扮演了重要的角色,具有以下優點:

  • 1. 封裝數據:JavaBean通過私有屬性和公共的getter和setter方法提供對數據的封裝,遵循面向對象的封裝原則,提高了程序的安全性和可維護性。
  • 2. 兼容性:JavaBean對象可以與其他Spring組件無縫集成,如IoC容器、數據綁定、AOP等。通過JavaBean,可以將業務邏輯和數據操作解耦,增加了代碼的靈活性和可擴展性
  • 3. 可重用性:JavaBean可以在不同的應用程序中被重復使用,無需重新編寫邏輯。這種可重用性可以大大提高開發效率,減少代碼冗余
  • 4. 數據綁定:Spring框架提供了數據綁定功能,可以通過JavaBean將請求參數直接綁定到對象的屬性上,簡化了數據處理的過程
  • 5. 持久化:JavaBean類可以通過持久化技術(如Hibernate、JPA等)將對象保存到數據庫中,實現數據的持久化存儲和檢索

綜上所述,學習JavaBean對于使用Spring框架進行Java開發是非常重要的。它可以幫助我們實現代碼的模塊化、封裝和重用,提高開發效率和代碼質量,同時也符合面向對象的設計原則。

( 2 ) 背景概述

  • 面向對象編程:Java是一種面向對象的編程語言,強調通過封裝、繼承和多態等特性來建立可維護和可擴展軟件系統。JavaBean作為一種符合面向對象原則的編程風格,鼓勵將數據和行為封裝到獨立的對象中。

  • 反射與可擴展性:Java的反射機制提供了運行時動態獲取類和對象信息的能力,這為JavaBean的創建和操作提供了基礎。通過反射,Spring框架可以在運行時實例化JavaBean并設置屬性,從而實現解耦和可擴展的編程模型

  • Inversion of Control(IoC):IoC是Spring框架的核心概念之一,它通過將對象的創建和依賴注入的控制權交給框架來實現松耦合。JavaBean的使用正是為了支持IoC,通過約定和配置,Spring框架可以自動地管理和協調JavaBean對象的創建和依賴注入

  • 數據綁定和數據訪問:Spring框架提供了強大的數據綁定和數據訪問的功能,可以通過JavaBean來實現請求參數與對象屬性的自動綁定,并將JavaBean與數據庫或其他數據源連接起來。這樣可以簡化開發過程,提高代碼的可讀性和可維護性

  • ?AOP支持:JavaBean作為Spring框架中的組件,可以非常方便地與AOP(面向切面編程)進行集成,實現橫切關注點的解耦。通過對JavaBean對象的增強,可以實現事務管理、日志記錄、安全驗證等共享的橫切功能

綜上所述,JavaBean在Spring框架中的背景是基于Java語言的面向對象編程原則,結合反射、IoC和AOP等技術的應用。JavaBean的引入使得Spring框架更加靈活、可擴展,并提供了一種符合規范的對象編程模型,用于簡化開發過程和管理對象的生命周期

( 3 ) 作用

在Spring框架中,JavaBean是指符合特定規范的普通Java類,它起到了組件的角色。JavaBean在Spring中充當了以下重要的角色和作用:?

  • 組件化:JavaBean作為Spring框架中的組件,可以被容器管理和維護。通過將JavaBean注冊到Spring的IoC容器中,可以實現對其生命周期的控制,包括創建、初始化、銷毀等。

  • 依賴注入(Dependency Injection):JavaBean通過依賴注入實現對象之間的松耦合關系。在Spring中,通過配置信息或注解,容器可以自動將依賴注入到JavaBean中,避免了硬編碼和耦合的問題,提高了代碼的可測試性和可維護性。

  • 數據綁定:JavaBean可以作為數據模型,通過與Spring框架提供的數據綁定功能,將請求參數直接綁定到JavaBean的屬性上。這樣可以非常方便地處理用戶提交的表單數據、進行數據驗證和類型轉換等操作。

  • AOP支持:JavaBean可以和AOP無縫集成,通過為JavaBean添加切面,可以實現橫切關注點的解耦。例如,在JavaBean的方法上添加事務管理切面,實現對事務的控制,而JavaBean無需關心具體的事務管理代碼。

  • 序列化與持久化:JavaBean可以通過實現Serializable接口,使得它們的實例可以被序列化為字節流,從而實現網絡傳輸和持久化存儲。在Spring中,通過JavaBean的持久化技術(如Hibernate、JPA等),可以將JavaBean的狀態保存到數據庫中。

  • 配置管理:JavaBean可以通過Spring提供的配置機制(如XML配置、注解配置等),在應用程序啟動時進行加載和初始化,Spring容器根據配置信息創建相應的JavaBean對象。這種方式使得應用程序的配置更加靈活和可管理。

總的來說,JavaBean在Spring框架中扮演了重要的角色,它不僅是一個普通的Java類,還具有組件化、依賴注入、數據綁定、AOP支持等功能。學習和使用JavaBean,可以幫助開發人員更好地理解和使用Spring框架,從而提高開發效率和代碼質量。

二、生命周期

?2.1 講述

在Spring中,JavaBean的生命周期涉及到以下類和接口:

  • 1. 實例化:在這個階段,Spring使用反射機制創建JavaBean的實例。主要使用的類是Class類,該類提供了獲取類的構造方法的方法。在配置文件中,可以使用<bean>標簽來配置JavaBean的實例化方式,包括使用默認構造方法實例化、使用靜態工廠方法實例化或使用實例工廠方法實例化。
  • 2. 屬性注入:在實例化完成后,Spring會將屬性值注入到JavaBean中。這個階段使用到的類有BeanWrapper、BeanDefinition和PropertyValues。BeanWrapper是一個用于包裝JavaBean的類,它可以通過反射設置JavaBean的屬性值。BeanDefinition是一個用于描述JavaBean的元數據的類,它包含了JavaBean的類名、屬性值等信息PropertyValues是一個用于保存JavaBean屬性值的類,它可以通過鍵值對的方式保存屬性值。在配置文件中,可以使用<property>標簽或通過注解來配置JavaBean的屬性注入方式。
  • 3. 初始化:在屬性注入完成后,Spring會調用JavaBean的初始化方法。這個階段可以通過實現InitializingBean接口或在配置文件中指定初始化方法來實現。InitializingBean接口中有一個afterPropertiesSet()方法,可以在該方法中進行初始化操作。另外,還可以通過在配置文件中使用init-method屬性來指定初始化方法。在初始化方法中,可以進行一些對象的初始化操作,如初始化連接池、加載配置文件等。
  • 4. 使用:在初始化完成后,JavaBean可以被其他組件或對象使用了。這個階段主要是調用JavaBean的方法進行業務邏輯處理
  • 5. 銷毀:當Spring容器關閉時,會調用JavaBean的銷毀方法進行資源的釋放。這個階段可以通過實現DisposableBean接口或在配置文件中指定銷毀方法來實現。DisposableBean接口中有一個destroy()方法,可以在該方法中進行資源釋放操作。另外,還可以通過在配置文件中使用destroy-method屬性來指定銷毀方法。在銷毀方法中,可以進行一些資源的釋放操作,如關閉連接、釋放內存等。

需要注意的是,JavaBean的生命周期是由Spring容器管理的,所以只有在Spring容器中才會進行相應的生命周期操作。如果使用純Java方式創建的對象,則不會經過Spring的生命周期管理。在配置文件中,可以使用XML配置方式或注解方式來描述JavaBean的生命周期。XML配置方式可以通過<bean>標簽來配置JavaBean的屬性值、初始化方法和銷毀方法。注解方式可以通過在JavaBean類上使用相應的注解來描述初始化方法和銷毀方法,如@PostConstruct和@PreDestroy注解。

2.2 相關內容

?1) .?BeanDefinitionReader

在Spring中,BeanDefinitionReader是用于讀取并解析配置文件的類,它在JavaBean的生命周期中起著重要的作用。

在JavaBean的生命周期中,BeanDefinitionReader主要用于實例化和屬性注入階段。它會讀取配置文件中的<bean>標簽,并解析其中的屬性值、初始化方法和銷毀方法等信息。通過解析配置文件,BeanDefinitionReader可以獲取到JavaBean的類名、屬性值、初始化方法和銷毀方法等元數據。

在實例化階段,BeanDefinitionReader會根據配置文件中的信息使用反射機制創建JavaBean的實例。它會根據配置文件中的<bean>標簽中的class屬性獲取到JavaBean的類名,并使用反射機制創建JavaBean的實例。

在屬性注入階段,BeanDefinitionReader會根據配置文件中的<property>標簽獲取到JavaBean的屬性值,并使用反射機制將屬性值注入到JavaBean中。它會根據配置文件中的<property>標簽中的name屬性獲取到屬性名,然后根據name屬性獲取到對應的屬性值,并使用反射機制將屬性值注入到JavaBean中。

除了實例化和屬性注入階段,BeanDefinitionReader還可以在其他階段發揮作用。例如,在初始化階段,BeanDefinitionReader可以讀取配置文件中的init-method屬性,并將其作為初始化方法進行調用。在銷毀階段,BeanDefinitionReader可以讀取配置文件中的destroy-method屬性,并將其作為銷毀方法進行調用。

總之,BeanDefinitionReader在JavaBean的生命周期中起著解析和讀取配置文件的作用,它能夠獲取到JavaBean的元數據,并根據配置文件中的信息進行實例化、屬性注入、初始化和銷毀等操作。

?2) . BeanDefinition

BeanDefinition是Spring框架中的一個重要概念,它用于描述和定義一個Bean的信息。

具體來說,BeanDefinition的作用主要有以下幾個方面:

  • 1. 定義Bean的屬性:BeanDefinition定義了一個Bean的屬性,包括Bean的類名、作用域、是否懶加載、依賴關系等。通過BeanDefinition,可以對Bean的屬性進行配置和管理。
  • 2. 描述Bean的依賴關系:BeanDefinition描述了Bean與其他Bean之間的依賴關系。它可以指定Bean所依賴的其他Bean,以及依賴的方式(如通過構造函數注入、setter方法注入等)。通過BeanDefinition,可以實現Bean之間的依賴注入。
  • 3. 定義Bean的初始化和銷毀方法:BeanDefinition可以定義Bean的初始化方法和銷毀方法。它可以指定Bean在實例化之后需要執行的初始化方法,以及在銷毀之前需要執行的銷毀方法。通過BeanDefinition,可以實現對Bean生命周期的管理。
  • 4. 擴展Bean的功能:通過BeanDefinition,可以對Bean的定義進行擴展,實現自定義的功能。可以在BeanDefinition中添加AOP切面、事務管理等功能,從而實現對Bean的增強。
  • 5. 靈活配置Bean的定義:BeanDefinition提供了靈活的配置方式,可以通過XML配置文件、注解或編程的方式來定義Bean。可以根據需要,選擇合適的方式來配置Bean的定義。

總之,BeanDefinition是Spring框架中用于描述和定義Bean的信息的重要概念。它定義了Bean的屬性、依賴關系、初始化和銷毀方法等信息,可以實現對Bean的配置和管理。通過BeanDefinition,可以實現靈活的Bean配置和擴展,從而實現對Bean的定制化功能。

?3) .?BeanFactoryPostProcessor

BeanFactoryPostProcessor是Spring框架中的一個擴展接口,它可以在Spring容器實例化Bean之后,對Bean的定義進行修改或擴展。

具體來說,BeanFactoryPostProcessor的作用主要有以下幾個方面:

  • 1. 修改Bean的定義:通過實現BeanFactoryPostProcessor接口,可以在Spring容器實例化Bean之前,對Bean的定義進行修改。可以添加、刪除或修改Bean的屬性值、作用域、依賴關系等。這樣可以在不修改源代碼的情況下,對Bean的定義進行動態調整。
  • 2. 擴展Bean的定義:通過實現BeanFactoryPostProcessor接口,可以在Spring容器實例化Bean之前,對Bean的定義進行擴展。可以添加新的Bean定義,或者通過修改Bean的定義來實現自定義的擴展功能。例如,可以在Bean的定義中添加AOP切面、事務管理等功能。
  • 3. 配置Bean的屬性值:通過實現BeanFactoryPostProcessor接口,可以在Spring容器實例化Bean之前,對Bean的屬性值進行配置。可以根據需要,動態地設置Bean的屬性值,從而實現更靈活的配置。
  • 4. 解析和處理Bean的定義:BeanFactoryPostProcessor接口還可以用于解析和處理Bean的定義。可以根據需要,對Bean的定義進行解析和處理,以實現特定的邏輯。例如,可以根據Bean的定義生成其他相關的Bean定義,或者根據Bean的定義進行一些邏輯判斷和處理。

需要注意的是,BeanFactoryPostProcessor是在Spring容器實例化Bean之后,對Bean的定義進行修改或擴展的。它與BeanPostProcessor接口的區別在于,BeanFactoryPostProcessor是在Bean的定義階段進行操作,而BeanPostProcessor是在Bean的實例化和初始化階段進行操作。因此,BeanFactoryPostProcessor可以對Bean的定義進行修改,而BeanPostProcessor只能對Bean的實例進行操作。

?4) . BeanFactory

BeanFactory是Spring框架中的核心接口之一,它是用于管理和獲取Bean實例的工廠。

具體來說,BeanFactory的作用主要有以下幾個方面:

  • 1. 實例化Bean:BeanFactory負責根據配置文件或注解等方式,實例化JavaBean。它會根據配置文件中的<bean>標簽或注解中的配置信息,使用反射機制創建JavaBean的實例。通過BeanFactory,可以方便地創建和獲取各種類型的Bean實例。
  • 2. 管理Bean的生命周期:BeanFactory管理著Bean的生命周期。它會在需要時創建Bean的實例,并在不需要時銷毀Bean的實例。通過BeanFactory,可以控制Bean的創建、初始化和銷毀等過程,實現對Bean的靈活管理。
  • 3. 注入依賴關系:BeanFactory負責將Bean之間的依賴關系注入到Bean實例中。它會根據配置文件中的<property>標簽或注解中的依賴關系,將依賴的Bean注入到目標Bean中。通過BeanFactory,可以實現Bean之間的依賴注入,從而實現松耦合的設計。
  • 4. 提供Bean的訪問接口:BeanFactory提供了訪問Bean的接口,可以方便地獲取已經實例化的Bean。通過BeanFactory,可以根據Bean的名稱或類型,獲取到對應的Bean實例。這樣可以方便地在應用程序中使用Bean,實現各種功能。

總之,BeanFactory是Spring框架中用于管理和獲取Bean實例的核心接口。它負責實例化Bean、管理Bean的生命周期、注入依賴關系和提供Bean的訪問接口等功能,是Spring框架中實現IoC(控制反轉)和DI(依賴注入)的重要組成部分。

?5) .?Aware

Aware是Spring框架中的一組接口,用于在Bean實例化過程中向Bean注入特定的資源或回調接口。

具體來說,Aware接口主要有以下幾個作用:

  • 1. 提供對Spring容器的訪問:通過實現ApplicationContextAware接口,Bean可以獲取對Spring容器的引用。這樣可以在Bean中直接訪問Spring容器的各種功能,如獲取其他Bean、獲取環境變量等。
  • 2. 提供對BeanFactory的訪問:通過實現BeanFactoryAware接口,Bean可以獲取對BeanFactory的引用。這樣可以在Bean中直接訪問BeanFactory的各種功能,如獲取Bean的定義、獲取Bean的屬性等。
  • 3. 提供對Bean的名稱的訪問:通過實現BeanNameAware接口,Bean可以獲取自己在Spring容器中的名稱。這樣可以在Bean中獲取自己的名稱,做一些特定的處理。
  • 4. 提供對資源的訪問:通過實現ResourceLoaderAware接口,Bean可以獲取對資源加載器的引用。這樣可以在Bean中直接加載資源,如讀取配置文件、訪問文件等。
  • 5. 提供對消息源的訪問:通過實現MessageSourceAware接口,Bean可以獲取對消息源的引用。這樣可以在Bean中直接訪問消息源,實現國際化和本地化的功能。

通過實現這些Aware接口,Bean可以獲取到Spring容器的相關資源或回調接口,從而實現對這些資源的訪問或使用。這樣可以在Bean中更方便地實現一些特定的功能,提高系統的靈活性和可擴展性。

三、模式

3.1 概述

Spring是一個綜合性的開發框,如果不進行配置,它默認是單例模式

但它也可以配置為多例模式。

?單例模式

Spring使用單例模式的主要優點和好處包括:

  • 1. 節省資源:單例模式可以確保在整個應用程序中只有一個實例存在,節省了系統資源的開銷。每次請求都返回同一個實例,避免了重復創建對象的開銷。
  • 2. 提高性能:由于單例模式只創建一個實例,避免了頻繁的創建和銷毀對象的開銷,從而提高了系統的性能。
  • 3. 避免競爭條件:在多線程環境下,使用單例模式可以避免多個線程同時訪問和修改對象的狀態,從而避免了競爭條件和數據不一致的問題。
  • 4. 統一管理和協調資源:單例模式可以統一管理和協調系統中的共享資源,確保資源的正確使用和釋放,避免資源泄漏和浪費。
  • 5. 提供全局訪問點:單例模式可以提供一個全局的訪問點,方便其他對象或模塊通過該訪問點來獲取實例,簡化了對象的使用和調用。
  • 6. 簡化配置和管理:在Spring框架中,將Bean定義為單例模式可以簡化配置和管理,只需要在配置文件或注解中聲明為單例即可,Spring容器負責創建和管理單例對象。

總的來說,Spring使用單例模式的優點包括節省資源、提高性能、避免競爭條件、統一管理和協調資源、提供全局訪問點以及簡化配置和管理。這些優點使得Spring在處理大規模應用和高并發環境下表現出色,并且提供了更好的可擴展性和可維護性。

在使用單例模式時,可能會存在以下兩個缺點:

  • 1. 狀態共享和線程安全問題:由于單例模式只創建一個實例,多個線程共享該實例,可能會導致狀態共享和線程安全問題。如果多個線程同時訪問和修改單例對象的狀態,可能會導致數據不一致的問題。為了解決這個問題,需要在代碼中進行適當的同步控制,增加了開發和維護的復雜度。
  • 2. 依賴關系和耦合度高:單例模式會導致對象之間的依賴關系和耦合度較高。由于單例對象在整個系統中都是可見的,其他對象可能會直接依賴于單例對象,導致對象之間的緊耦合。這樣一來,當需要對單例對象進行修改或替換時,可能會涉及到多個對象的修改,增加了系統的維護成本和風險。

需要注意的是,這些缺點并不是單例模式本身的問題,而是在使用單例模式時可能會出現的問題。通過合理的設計和使用,可以減輕這些問題的影響。比如,可以通過盡量避免共享狀態、合理控制同步訪問、使用線程安全的方式創建單例對象等方式來解決狀態共享和線程安全問題;同時,可以通過依賴注入、面向接口編程等方式降低對象之間的耦合度。

總結的說 : 單列模式可以節約內存,提高性能、但是會有變量污染,提高風險。

?多例模式

在Spring框架中,多例模式(Prototype Pattern)是指每次獲取對象實例時都會創建一個新的實例,相比于單例模式,多例模式具有以下優點和好處:

  • 1. 靈活性:多例模式可以根據需求創建多個實例,每個實例可以有不同的狀態和屬性,提供了更大的靈活性和定制性。
  • 2. 避免共享狀態:多例模式每次創建新的實例,避免了多個對象之間共享狀態的問題。每個實例都是獨立的,互不影響。
  • 3. 高并發性能:在高并發環境下,多例模式可以減少線程競爭,提高系統的并發性能。每個線程獲取到的都是獨立的實例,不會出現資源競爭的情況。
  • 4. 避免單例模式的缺點:單例模式在某些場景下可能會存在線程安全問題、資源占用過多等缺點,而多例模式可以避免這些問題。
  • 5. 降低耦合度:多例模式可以降低對象之間的耦合度,每個對象都是獨立的,可以獨立創建和銷毀,不會產生過多的依賴關系。
  • 6. 提供靈活的生命周期管理:多例模式可以通過Spring容器的生命周期管理功能來管理實例的創建和銷毀,提供了更靈活的生命周期管理方式。

需要注意的是,多例模式也存在一些潛在的問題,比如對象的創建和銷毀開銷較大,可能會影響系統性能;多例模式可能會導致對象的過度創建,占用過多的系統資源。因此,在使用多例模式時需要根據具體的業務場景和性能需求進行權衡和選擇。

在Spring框架中使用多例模式(Prototype Pattern)可能會存在以下缺點:

  • 1. 資源消耗過多:每次獲取多例對象時都會創建一個新的實例,這可能會導致系統資源的過度消耗。如果多例對象的創建和銷毀過程比較復雜,可能會導致系統性能下降。
  • 2. 難以管理和維護:多例模式創建的實例數量可能會很多,這會增加系統的復雜性和維護成本。如果沒有良好的管理和控制機制,可能會導致實例過多、內存泄漏等問題。
  • 3. 難以保證一致性:多例模式創建的實例是相互獨立的,每個實例都有自己的狀態和屬性。這可能會導致系統中存在大量的不一致性,增加了系統的復雜性和調試難度。
  • 4. 不適合共享資源:多例模式每次創建新的實例,不適合用于共享資源的場景。如果多個對象需要共享某些資源,可能需要額外的處理和同步機制。

需要根據具體的業務場景和性能需求來選擇使用多例模式。在一些需要靈活性和定制性較高的場景下,多例模式可以提供更大的靈活性。但同時也需要注意管理和控制多例對象的數量,避免資源的過度消耗。

總結的說: 多列模式沒有變量污染,沒有風險,但是會非常消耗資源及內存。

3.2 演示

創建 ParamAction 類

package com.CloudJun.bean;import java.util.List;/*** @author CloudJun* @create? 2023-08-18 13:44*/
public class ParamAction {private int age;private String name;private List<String> hobby;private int num = 1;// private UserBiz userBiz = new UserBizImpl1();public ParamAction() {super();}public ParamAction(int age, String name, List<String> hobby) {super();this.age = age;this.name = name;this.hobby = hobby;}public void execute() {// userBiz.upload();// userBiz = new UserBizImpl2();System.out.println("this.num=" + this.num++);System.out.println(this.name);System.out.println(this.age);System.out.println(this.hobby);}
}

創建?InstanceFactory 類

package com.CloudJun.bean;/*** @author CloudJun* @create? 2023-08-18 13:42*/
public class InstanceFactory {public void init() {System.out.println("初始化方法");}public void destroy() {System.out.println("銷毀方法");}public void service() {System.out.println("業務方法");}
}

創建配置文件?spring-bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean  class="com.CloudJun.bean.ParamAction" id="paramAction" scope="prototype"><constructor-arg name="name" value="三豐"></constructor-arg><constructor-arg name="age" value="21"></constructor-arg><constructor-arg name="hobby"><list><value>抽煙</value><value>燙頭</value><value>大保健</value></list></constructor-arg></bean><bean id="instanceFactory" class="com.CloudJun.bean.InstanceFactory"scope="singleton" init-method="init" destroy-method="destroy"></bean></beans>

創建測試類 Demo2

package com.CloudJun.bean;import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;/** spring	bean的生命週期* spring	bean的單例多例* @author CloudJun* @create? 2023-08-18 13:44**/
public class Demo2 {// 體現單例與多例的區別@Testpublic void test1() {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-bean.xml");
//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-bean.xml");ParamAction p1 = (ParamAction) applicationContext.getBean("paramAction");ParamAction p2 = (ParamAction) applicationContext.getBean("paramAction");// System.out.println(p1==p2);p1.execute();p2.execute();//		單例時,容器銷毀instanceFactory對象也銷毀;多例時,容器銷毀對象不一定銷毀;applicationContext.close();}// 體現單例與多例的初始化的時間點 instanceFactory@Testpublic void test2() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-bean.xml");InstanceFactory instanceFactory = (InstanceFactory) applicationContext.getBean("instanceFactory");}// BeanFactory會初始化bean對象,但會根據不同的實現子類采取不同的初始化方式// 默認情況下bean的初始化,單例模式立馬會執行,但是此時XmlBeanFactory作為子類,單例模式下容器創建,bean依賴沒有初始化,只有要獲取使用bean對象才進行初始化@Testpublic void test3() {// ClassPathXmlApplicationContext applicationContext = new// ClassPathXmlApplicationContext("/spring-bean.xml");Resource resource = new ClassPathResource("/spring-bean.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);InstanceFactory i1 = (InstanceFactory) beanFactory.getBean("instanceFactory");}}

測試Demo2中的test1方法

使用單例模式測試結果

將spring-bean.xml 配置文件中的scope="prototype"修改

為scope="singleton"便是使用多例模式

使用多例模式測試結果

測試Demo2中的test2方法

( 提示: 當內容比較多時,可以在xml配置文件中修改單列或者多列模式繼續運行速度測試 )?

測試Demo2中的test3方法

BeanFactory會初始化bean對象,但會根據不同的實現子類采取不同的初始化方式?

( 提示: 當內容比較多時,可以在xml配置文件中修改單列或者多列模式繼續運行速度測試 )?

給我們帶來什么收獲

學習Spring框架中的JavaBean對我們有以下收獲:

  • 1. 靈活的開發方式:學習使用JavaBean可以幫助我們以一種更加靈活和可擴展的方式進行開發。JavaBean的依賴注入機制可以幫助我們實現松耦合的組件之間的交互,提高代碼的可維護性和可測試性。
  • 2. 提高開發效率:Spring框架提供了大量的現成的JavaBean組件,可以在我們的應用程序中直接使用。這些組件包括事務管理、持久化、安全驗證等功能,可以節省我們自己編寫這些功能代碼的時間和精力,提高開發效率。
  • 3. 更好的代碼組織和管理:通過將應用程序中的不同功能模塊拆分成各個JavaBean組件,可以使代碼更具可讀性、可維護性和可擴展性。JavaBean也可以作為數據模型,幫助我們將業務邏輯與數據操作分離,使代碼更好地符合單一職責原則。
  • 4. 使用Spring提供的功能和特性:學習使用JavaBean可以打開使用Spring框架更多功能和特性的大門。Spring提供了豐富的功能,如AOP、數據綁定、事務管理等,通過合理利用JavaBean,我們可以從中受益,提高應用程序的質量和性能。
  • 5. 探索Java生態系統:JavaBean在Spring框架中的使用是我們進入更廣闊Java生態系統的一扇門。Spring是Java生態系統中最流行的框架之一,掌握JavaBean的使用,有助于我們更好地理解和使用其他相關框架和技術。

綜上所述,學習Spring框架中的JavaBean可以為我們帶來諸多收獲,包括靈活的開發方式、提高開發效率、更好的代碼組織和管理,以及進一步探索Java生態系統的機會。掌握JavaBean的使用,可以使我們更加熟練地使用Spring框架,并在日常開發中取? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【計算機視覺|生成對抗】StackGAN:使用堆疊生成對抗網絡進行文本到照片逼真圖像合成

本系列博文為深度學習/計算機視覺論文筆記&#xff0c;轉載請注明出處 標題&#xff1a;StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 鏈接&#xff1a;[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

ViewFs And Federation On HDFS

序言 ViewFs 是在Federation的基礎上提出的,用于通過一個HDFS路徑來訪問多個NameSpace,同時與ViewFs搭配的技術是client-side mount table(這個就是具體的規則配置信息可以放置在core.xml中,也可以放置在mountTable.xml中). 總的來說ViewFs的其實就是一個中間層,用于去連接不…

Vue3 setup語法糖 解決富文本編輯器上傳圖片64位碼過長問題 quill-image-extend-module

引言&#xff1a; 富文本編輯器傳圖片會解碼成64位&#xff0c;非常長導致數據庫會報錯第一種方法&#xff1a;將數據庫類型改成 mediumtext第二種辦法&#xff1a;本文中的方法 說明&#xff0c;本周文所用語法糖為Vue3 setup語法&#xff0c;即<script setup> 思路 攔…

HIVE SQL通過Lateral View + explode實現列轉行

原表&#xff1a; abAndy<碟中諜>,<諜影重重>,<007>MOMO<小鞋子>,<朋友啊你的家在哪里> 實現效果 abAndy<碟中諜>Andy<諜影重重>Andy<007>MOMO<小鞋子>MOMO<朋友啊你的家在哪里> 實現代碼&#xff1a; selec…

STM32 F103C8T6學習筆記8:0.96寸單色OLED顯示屏顯示字符

使用STM32F103 C8T6 驅動0.96寸單色OLED顯示屏: OLED顯示屏的驅動&#xff0c;在設計開發中OLED顯示屏十分常見&#xff0c;因此今日學習一下。一篇文章從程序到顯示都講通。 文章提供源碼、原理解釋、測試工程下載&#xff0c;測試效果圖展示。 目錄 OLED驅動原理—IIC通信…

無涯教程-Perl - undef函數

描述 此函數未定義EXPR的值。用于標量,列表,哈希,函數或類型范圍。在帶有諸如undef $hash {$key}之類的語句的哈希上使用&#xff1b;實際上將指定鍵的值設置為未定義的值。 如果要從哈希中刪除元素,請使用delete函數。 語法 以下是此函數的簡單語法- undef EXPRundef返回…

Java進階篇--迭代器模式

目錄 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 擴展小知識: 異步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 總結&#xff1a…

LeetCode 每日一題 2023/8/14-2023/8/20

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 8/14 617. 合并二叉樹8/15 833. 字符串中的查找與替換8/16 2682. 找出轉圈游戲輸家8/17 1444. 切披薩的方案數8/18 1388. 3n 塊披薩8/19 2235. 兩整數相加8/20 8/14 617. 合…

【學習FreeRTOS】第9章——FreeRTOS任務調度

1.開啟任務調度器 vTaskStartScheduler() 作用&#xff1a;用于啟動任務調度器&#xff0c;任務調度器啟動后&#xff0c; FreeRTOS 便會開始進行任務調度【動態創建任務為例】 創建空閑任務如果使能軟件定時器&#xff0c;則創建定時器任務關閉中斷&#xff0c;防止調度器開…

Microsoft ISA服務器配置及日志分析

Microsoft ISA 分析器工具&#xff0c;可分析 Microsoft ISA 服務器&#xff08;或 Forefront 威脅管理網關服務器&#xff09;的日志并生成安全和流量報告。支持來自 Microsoft ISA 服務器組件的以下日志&#xff1a; 數據包過濾器ISA 服務器防火墻服務ISA 服務器網絡代理服務…

透過源碼理解Flutter中widget、state和element的關系

1、framework源碼組成 Flutter中widget、state、element的源碼位于framework.dart中&#xff0c;整個文件6693行(版本Flutter 3.12.0-14.0.pre.28)。整個代碼可劃分為若干部分&#xff0c;主要包括key、widget、state、element四部分。 1.1 key 關于key的代碼65行到272行&am…

NVIDIA GPU驅動和CUDA工具包 Linux CentOS 7 在線安裝指南

挑選指定系統和對應的GPU型號下載驅動和CUDA工具包: Linux CentOS安裝NVIDIA GPU驅動程序和NVIDIA CUDA工具包_centos安裝顯卡驅動和cuda_Entropy-Go的博客-CSDN博客 相比之下&#xff0c;本文是在線安裝NVIDIA GPU驅動和CUDA工具包方式&#xff0c;省去挑選對應正確安裝包的煩…

Uniapp Syntax Error: Error: Unbalanced delimiter found in string

報錯 in ./src/pages/user/components/tasks.vue?vue&typescript&langjs&Syntax Error: Error: Unbalanced delimiter found in string...這邊導致文件的原因&#xff1a;可能是條件編譯語法不小心刪了某個字符&#xff0c;導致不全&#xff0c;無法形成一對。 //…

GuLi商城-前端基礎Vue-生命周期和鉤子函數

下圖展示了實例的生命周期。你不需要立馬弄明白所有的東西&#xff0c;不過隨著你的不斷學習和使用&#xff0c;它 的參考價值會越來越高。 VUE 的生命周期指的是組件在創建、運行和銷毀過程中所經歷的一系列事件&#xff0c;通過這些事件可以 讓開發者在不同階段進行相應的…

vue3 + antv/x6 實現拖拽側邊欄節點到畫布

前篇&#xff1a;vue3ts使用antv/x6 自定義節點 前篇&#xff1a;vue3antv x6自定義節點樣式 1、創建側邊欄 用antd的menu來做側邊欄 npm i --save ant-design-vue4.x//入口文件main.js內 import Antd from ant-design-vue; import App from ./App; import ant-design-vue/…

安卓的代碼加固和其他安全問題

文章目錄 安卓加固apk文件結構dex加固過程 其它安全問題 安卓加固 從App的加固技術來看:主流分為dex加密和so加密,目前來看保護dex文件更為重要,因為dex反編譯后的java代碼可讀性更強。 android-ndk: Native Development Kit 官網解釋&#xff1a;這套工具使您能在 Android 應…

Kvm配置ovs網橋

環境&#xff1a;部署在kvm虛擬環境上&#xff08;讓虛擬機和宿主機都可以直接從路由器獲取到獨立ip&#xff09; 1、安裝ovs軟件安裝包并啟動服務&#xff08;一般采用源碼安裝&#xff0c;此處用yum安裝&#xff09; yum install openvswitch-2.9.0-3.el7.x86_64.rpm syste…

Git常見操作

一、全局配置命令 配置級別&#xff1a; –local&#xff08;默認&#xff0c;高級優先&#xff09;&#xff1a;只影響本地倉庫 –global(中優先級)&#xff1a;只影響所有當前用戶的git倉庫 –system&#xff08;低優先級&#xff09;&#xff1a;影響到全系統的git倉庫 1…

【力扣】739. 每日溫度 <單調棧>

【力扣】739. 每日溫度 給定一個整數數組 temperatures &#xff0c;表示每天的溫度&#xff0c;返回一個數組 answer &#xff0c;其中 answer[i] 是指對于第 i 天&#xff0c;下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 …

劍指 Offer 40. 最小的k個數(C+實現)

劍指 Offer 40. 最小的k個數https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/ 法1&#xff1a;二叉堆 通過最小堆&#xff0c;直接篩選出最小的k個數 vector<int> getLeastNumbers(vector<int>& arr, int k) {priority_queue<int, vector<int>…