JavaEE開發之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表達式


上篇博客我們聊了《JavaEE開發之Spring中的依賴注入以及AOP》,本篇博客我們就來聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下Spring中的EL表達式。在Spring框架中我們可以使用@Scope注解來指定我們定義的Bean的作用域。下方會具體介紹幾種參數的作用域。

在創建Bean時我們可以使用Java配置的方式,也就是@Bean注解initMethod屬性和destroyMethod屬性來指定對應Bean的init()方法和destroy()方法。當然,除了Java配置的方式,我們還可以使用JSR-250的注解形式為相應的Bean來指定Init和Destroy方法。其中主要使用到了@PostContruct注解來指定構造器執行完就執行的方法,使用@PreDestroy注解來指定Bean對象銷毀之前執行的方法。下方會具體給出相應的實現。

本篇博客我們還會聊一下Spring框架中的EL表達式,其實主要還是使用@Value注解。@Value注解可以給據其指定的參數以及所賦值的屬性的類型來為相應的對象的屬性進行賦值。我們可以使用@Value注解為屬性賦常規值、URI資源、文件資源、系統屬性、其他類對象的屬性等。具體下方會給出相應的實現。

 

一、Bean的作用域

接下來我們將聊一下Bean的作用域。在使用@Repository、@Controller、@Service、@Component這些注解聲明Bean時,我們可以使用@Scope來指定相關Bean的作用域。@Scope后邊可以跟不同的參數,根據這些參數來設定Bean的作用域。@Scope可以跟下方的幾個參數:

  • Singleton: 單例Bean,當我們需要將一個Bean的作用域聲明為單例時,我們可以使用Singleton來將相應的類聲明為單例。Bean默認的Scope就是單例形式的。
  • Prototype:與單例相反,每次通過上下文獲取的都是一個新的對象。
  • Session:Web Project中使用,同一session會話中為同一個對象。
  • Request:Web Project中使用,每次HTTP請求都會新建一個Bean。
  • GlobalSession: 在portal應用中有用,給每個global http session新建一個Bean實例。

本篇博客不是基於Web Project的,所以我們只討論SingletonPrototype這兩個作用域。首先我們創建一個Scope為Singleton的Service,如下所示。然后我們再創建一個Scope為Prototype的Service,當然只把下方的singleton換成prototype即可。

  

 

創建好相應的Bean后,接下來我們就可以在Main方法中進行測試了。下方就是我們的Main函數中的內容以及該Main函數所運行的輸出結果。在Main函數中,我們分別從Spring的上下文中獲取兩個Singleton以及Prototype作用域對象。然后分別打印出每個對象的hashCode,從下方結果中我們可以看出,兩個Singleton的對象的hashCode是相同的,這就說明這兩個對象是一個對象。而Prototype的兩個對象的hashCode是不同的,具體結果如下所示:

  

 

 

二、Bean的Init與Destroy

本節,我們要聊的是如何在Bean創建之后以及Bean銷毀之前做一些事情。在Spring中,我們分別可以使用Java配置方式和注解方式來實現Bean的初始化以及銷毀之前的操作。下方我們先使用@BeaninitMethoddestroyMethod來實現Bean的Init與Destroy方法。然后在使用JSR-250@PostConstruct@PreDestroy兩個注解來實現。

 

1、Java配置實現Bean的Init與Destroy

該部分,我們將使用使用@BeaninitMethoddestroyMethod來實現Bean的Init與Destroy方法。首先我們創建一個BeanWayService類,然后在該類中創建一個init()方法和destroy()方法。稍后我們將在Java配置文件中對init()方法和destroy()方法指定特殊的用途。

  

 

緊接着我們就來創建相應的Java配置類,下方的Java配置類比較簡單,就一個指定BeanWayService類的Bean方法。在使用@Bean注解時,我們使用了initMethod屬性指定了BeanWayService的構造器執行后立即執行的方法,使用了destroyMethod屬性指定了BeanWayService對象銷毀之前所執行的方法。具體如下所示:

  

 

緊接着,我們就來看一下運行效果,下方就是我們的Main方法以及運行結果。從下方的輸出結果我們不難看出,BeanWayService的構造器執行完畢后,就立即執行了我們在Java配置文件中指定的init()方法,而在context關閉時,也就是在BeanWayService對象銷毀之前,調用了我們指定的destroy()方法。具體如下所示:

  

 

2、JSR-250的注解方式

下方就是通過JSR-250的注解方式來指定init()和destroy(),具體說使用@PostContruct注解來修飾構造器執行完后執行的init()方法,使用@PreDestroy注解來修改時對象銷毀之前要調用的destroy()方法。具體代碼如下所示。至於該部分的測試用例比較簡單,在此就不做過多贅述了。

  

 

 

三、Spring的EL表達式@Value

Spring框架中,我們可以使用Spring的EL表達式來快速的給Bean的屬性設置值。下方我們將演示幾種常用的Spring-EL表達式,包括給屬性賦字符串、賦值系統屬性、賦值其他類對象的屬性、賦值文件中的文本信息、賦值網絡URI中的資源等。下方會給出具體實現,其實還是主要是@Value注解的使用,@Value注解可以根據不同的參數值來進行解析,從而給不同類型的屬性分配不同的值。

 

1、引入文件IO的工具類

首先我們在Maven的pom.xml文件中添加上common-io的依賴包,common-io可簡化我們對文件的操作。在pom.xml中添加下方的依賴。

    <!--簡化文件操作-->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.3</version>
    </dependency>

 

 

2、創建提供屬性值的測試Service

下方創建了一個AnotherValueService類,該類會在后面的實例中用到。我們將使用EL表達式將該類的anotherValue屬性的值賦值給另一個類的屬性。anotherValue的值由@Value注解提供,如下所示:

  

 

 

3、創建Spring-EL測試的Service

接下來我們就來看一下Spring-EL表達式的使用方式。下方創建的DemoELService類就是我們用來測試Spring-EL表達式的類。下方主要包括字符串的直接賦值、系統屬性的賦值、其他對象屬性值的賦值、資源文件的賦值、URI資源的賦值。具體如下所示。

  

 

4.對上述Service的測試

下方就是我們的測試Main函數,以及該測試用例的輸出結果,如下所示:

  

 

本篇博客的內容也比較多了,就先到此,github源碼分享鏈接:https://github.com/lizelu/SpringDemo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM