日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用 Java 配置进行 Spring bean 管理--转

發(fā)布時間:2025/4/5 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Java 配置进行 Spring bean 管理--转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

眾所周知,Spring 框架是控制反轉(zhuǎn) (IOC) 或依賴性注入 (DI) 模式的推動因素,而這種推動是通過基于容器的配置實現(xiàn)的。過去,Spring 允許開發(fā)人員使用基于 XML 的配置,通過利用應用程序上下文 XML 文件來管理 bean 依賴性。此文件處于應用程序的外部,包含 bean 及其與該應用程序的依賴項的定義。盡管使用 XML 配置較為簡單和便捷,但仍有另外一種方法可定義 bean 及其依賴項。這種方法也稱為基于 Java 的配置。不同于 XML,基于 Java 的配置使您能夠以編程方式管理 bean。這可通過運用多種注釋來實現(xiàn)。 這篇文章將演示 Java 配置示例,并將其與傳統(tǒng) XML 配置方法相對比。本文將按照如下步驟演示基于 Java 的配置的基本用法:

  • 理解 @Configuration 和 @Bean 注釋
  • 使用 AnnotationConfigApplicationContext 注冊配置類
  • 配置 Web 應用程序
  • 實現(xiàn) bean 生命周期回調(diào)和范圍

我們將使用一所在線大學的 “創(chuàng)建課程” 用例。在創(chuàng)建課程的過程中,還會創(chuàng)建主題或者模塊,而各主題可能又有著不同的作業(yè)。因此,我們要創(chuàng)建三個 bean,分別為 Course、Module 和 Assignment。Course?bean 將包含一個對?Module?bean 的引用,后者包含對?Assignment?bean 的引用。

理解 @Configuration 和 @Bean 注釋

在理想的場景中,您可以在表示應用程序上下文的 XML 中定義 bean。以下代碼展示了創(chuàng)建課程?用例中的上下文 XML 及 bean 定義:

清單 1. XML 與 bean 定義
<beans><bean id="course" class="demo.Course"><property name="module" ref="module"/></bean><bean id="module" class="demo.Module"><property name="assignment" ref="assignment"/></bean><bean id="assignment" class="demo.Assignment" /> </beans>

以上 XML 就是您在使用 Spring 配置 bean 時通常會編寫的代碼。這段 XML 代碼定義了?Course?bean,它引用?Module?bean。Module?bean 有一個?Assignment?bean 的引用。您現(xiàn)在要刪除這段 XML,編寫同等效果的 Java 代碼。您將使用基于 Java 的配置定義上面指定的 bean。我們會將 XML 替換為 Java 類,這個 Java 類現(xiàn)在將用作 bean 配置的平臺。我們將這個類命名為?AppContext.java。以下代碼展示了?AppContext類。

清單 2. 包含 bean 定義的 AppContext 配置類
@Configuration public class AppContext {@Beanpublic Course course() {Course course = new Course();course.setModule(module());return course;}@Beanpublic Module module() {Module module = new Module();module.setAssignment(assignment());return module;}@Beanpublic Assignment assignment() {return new Assignment();} }

正如您通過以上代碼所看到的那樣,現(xiàn)在可以以編程的方式將 bean 定義為基于 Java 的配置的一部分。AppContext?類現(xiàn)在就像 XML 一樣表示配置類。這是通過利用?@Configuration?注釋實現(xiàn)的。@Configuration?注釋位于類的頂端。它告知 Spring 容器這個類是一個擁有 bean 定義和依賴項的配置類。@Bean?注釋用于定義 bean。上述注釋位于實例化 bean 并設(shè)置依賴項的方法上方。方法名稱與 bean id 或默認名稱相同。該方法的返回類型是向 Spring 應用程序上下文注冊的 bean。您可使用 bean 的 setter 方法來設(shè)置依賴項,容器將調(diào)用它們來連接相關(guān)項。基于 Java 的配置也被視為基于注釋的配置。

使用 AnnotationConfigApplicationContext 注冊配置類

在傳統(tǒng) XML 方法中,您可使用?ClassPathXmlApplicationContext?類來加載外部 XML 上下文文件。但在使用基于 Java 的配置時,有一個AnnotationConfigApplicationContext?類。AnnotationConfigApplicationContext?類是?ApplicationContext?接口的一個實現(xiàn),使您能夠注冊所注釋的配置類。此處的配置類是使用?@Configuration?注釋聲明的?AppContext。在注冊了所述類之后,@Bean?注釋的方法返回的所有 bean 類型也會得到注冊。以下代碼演示了?AnnotationConfigApplicationContext?類的使用:

清單 3. 使用 AnnotationConfigApplicationContext 注冊 AppContext 類
public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);Course course = ctx.getBean(Course.class);course.getName(); }

正如以上代碼所示,AppContext?配置類的注冊方式是將其傳遞給?AnnotationConfigApplicationContext?構(gòu)造函數(shù)。此外,您還可以使用所述上下文類的?register?方法來注冊配置類。以下代碼展示了另外一種方法。

清單 4. 注冊 AppContext 類:另外一種方法
public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(AppContext.class) }

注冊配置類將自動注冊?@Bean?注釋的方法名稱,因而其對應的 bean 就是?Course、Module?和?Assignment。隨后您可以使用?getBean?方法來獲取相關(guān)的 bean,并調(diào)用其業(yè)務方法。如您所見,編寫 Java 的配置類并將其注冊到 Spring 上下文非常簡單。下一節(jié)將討論如何將基于 Java 的配置與 Web 應用程序配合使用。

配置 Web 應用程序

過去,您通常要利用?XmlWebApplicationContext?上下文來配置 Spring Web 應用程序,即在 Web 部署描述符文件 web.xml 中指定外部 XML 上下文文件的路徑。XMLWebApplicationContext?是 Web 應用程序使用的默認上下文類。以下代碼描述了?web.xml?中指向?qū)⒂蒀ontextLoaderListener?監(jiān)聽器類載入的外部 XML 上下文文件的元素。

清單 5. 使用外部 XML 上下文文件的 web.xml
<web-app><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>sampleServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet>... </web-app>

現(xiàn)在,您要將?web.xml?中的上述代碼更改為使用?AnnotationConfigApplicationContext?類。切記,XmlWebApplicationContext?是 Spring 為 Web 應用程序使用的默認上下文實現(xiàn),因此您永遠不必在您的?web.xml?文件中顯式指定這個上下文類。現(xiàn)在,您將使用基于 Java 的配置,因此在配置 Web 應用程序時,需要在?web.xml?文件中指定?AnnotationConfigApplicationContext?類。上述代碼將修改如下:

清單 6. 修改后的使用 AnnotationConfigApplicationContext 的 web.xml
<web-app><context-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></context-param><context-param><param-name>contextConfigLocation</param-name><param-value>demo.AppContext</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>sampleServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param></servlet>... </web-app>

以上修改后的?web.xml?現(xiàn)在定義了?AnnotationConfigWebApplicationContext?上下文類,并將其作為上下文參數(shù)和 servlet 元素的一部分。上下文配置位置現(xiàn)在指向?AppContext?配置類。這非常簡單。下一節(jié)將演示 bean 的生命周期回調(diào)和范圍的實現(xiàn)。

實現(xiàn) bean 生命周期回調(diào)和范圍

生命周期回調(diào)

您還可以使用基于 Java 的配置來管理 bean 的生命周期。@Bean?支持兩種屬性,即?initMethod?和?destroyMethod,這些屬性可用于定義生命周期方法。在實例化 bean 或即將銷毀它時,容器便可調(diào)用生命周期方法。生命周期方法也稱為回調(diào)方法,因為它將由容器調(diào)用。使用?@Bean注釋注冊的 bean 也支持 JSR-250 規(guī)定的標準?@PostConstruct?和?@PreDestroy?注釋。如果您正在使用 XML 方法來定義 bean,那么就應該使用 bean 元素來定義生命周期回調(diào)方法。以下代碼顯示了在 XML 配置中通常使用 bean 元素定義回調(diào)的方法。

清單 7. 使用 XML 方法實現(xiàn)生命周期回調(diào)
<bean id="course" class="demo.Course" init-method="setup" destroy-method="cleanup" ><property name="module" ref="module"/> </bean>

以下代碼演示了使用 Java 配置的生命周期方法

清單 8. 使用 AppContext 配置類實現(xiàn) bean 生命周期方法
@Configuration public class AppContext {@Bean(initMethod = "setup", destroyMethod = "cleanup")public Course course() {Course course = new Course();course.setModule(module());return course;}@Bean(initMethod = "setup", destroyMethod = "cleanup")public Module module() {Module module = new Module();module.setAssignment(assignment());return module;}... } public class Course {private Module module;private String name;public Course() {}public void setup() {this.name = "M100 Pythagoras Theorems"}public void setModule(Module module) {this.module = module;}public void cleanup() {module = null;} }

上面的代碼重新訪問了?AppContext?配置類。@Bean?注釋現(xiàn)在有兩個額外的屬性,即?initMethod?和?destroyMethod。它們定義了生命周期方法的設(shè)置和清除。這些方法是在已經(jīng)注冊的 bean 中實現(xiàn)的,最終由容器在 bean 初始化及其銷毀之前調(diào)用它。這里以?Course?bean 為例,提供了生命周期方法實現(xiàn)。所實現(xiàn)的方法是?setup?和?cleanup。同樣,您還可以在?Module?和?Assignment?bean 中實現(xiàn)這些方法。

Bean 范圍

bean 的方法是使用?@Scope?注釋定義的。XML 中實現(xiàn)這一目標的方法是指定 bean 元素中的 scope 屬性。

清單 9. 使用 XML 方法定義 bean 范圍
<bean id="course" class="demo.Course" scope="prototype" ><property name="module" ref="module"/> </bean>

以下代碼展示了使用 Java 配置的 bean 范圍定義:

清單 10. 使用 AppContext 配置類定義 bean 范圍
@Configuration public class AppContext {@Bean(initMethod = "setup", destroyMethod = "cleanup")@Scope("prototype")public Course course() {Course course = new Course();course.setModule(module());return course;}... }

正如您在上面的代碼中所看到的那樣,在 Java 配置類中定義 bean 的范圍非常簡單。上面的?AppContext?配置類使用?@Scope?注釋為?Coursebean 定義了一個?prototype?范圍。默認范圍是?singleton。

利用 Java 配置可以做許多事情。本文只觸及了一些基礎(chǔ)內(nèi)容。使用 Java 配置并無顯著優(yōu)勢,它僅僅是 Spring 提供的 XML 配置的替代方法。對于不喜歡在框架中使用 XML 的人來說,這是實現(xiàn)配置的一種出色方法。但缺點也是顯而易見的,如果您對 Java 類中的配置做出了任何更改,就必須重新編譯應用程序。

原文:http://www.ibm.com/developerworks/cn/webservices/ws-springjava/

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4051110.html

總結(jié)

以上是生活随笔為你收集整理的使用 Java 配置进行 Spring bean 管理--转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。