javascript
原创 | 一文了解那些和Spring Bean有关的那些注解!
△Hollis, 一個對Coding有著獨特追求的人△
這是Hollis的第?220?篇原創分享
作者 l cxuan
來源 l Hollis(ID:hollischuang)
隨著Spring的流行,我們經歷過基于XML-Based 的配置,隨著SpringBoot的流行,我們逐漸使用基于注解的配置替換掉了基于XML-Based的配置,那么你知道基于注解的配置的基礎組件都是什么嗎?都包括哪些要素?那么本節就來探討一下。注:本篇文章更多的是討論Spring基于注解的配置一覽,具體的技術可能沒有那么深,請各位大佬見諒。
探討主題:
基礎概念:@Bean 和 @Configuration
使用AnnotationConfigApplicationContext 實例化Spring容器
使用@Bean 注解
使用@Configuration 注解
編寫基于Java的配置
Bean定義配置文件
PropertySource 抽象類
使用@PropertySource
占位符的聲明
基礎概念:@Bean 和 @Configuration
Spring中新的概念是支持@Bean注解 和 @Configuration 注解的類。@Bean 注解用來表明一個方法實例化,配置并且通過IOC容器初始化并管理一個新的對象。@Bean注解就等同于XML-Based中的<beans/>標簽,并且扮演了相同的作用。你可以使用基于注解的配置@Bean 和 @Component,然而他們都用在@Configuration配置類中。
使用@Configuration 注解的主要作用是作為bean定義的類,進一步來說,@Configuration注解的類允許通過調用同類中的其他@Bean標注的方法來定義bean之間依賴關系。如下所示:
新建一個maven項目(我一般都直接創建SpringBoot項目,比較省事),創建AppConfig,MyService,MyServiceImpl類,代碼如下:
上述的依賴關系等同于XML-Based:
使用AnnotationConfigApplicationContext 實例化Spring容器
AnnotationConfigApplicationContext 基于注解的上下文是Spring3.0 新添加的注解,它是ApplicationContext的一個具體實現,它可以接收@Configuration注解的類作為輸入參數,還能接收使用JSR-330元注解的普通@Component類。
當提供了@Configuration 類作為輸入參數時,@Configuration類就會注冊作為bean的定義信息并且所有聲明@Bean的方法也都會作為bean的定義信息。
當提供@Component和JSR-330 聲明的類時,他們都會注冊作為bean的定義信息,并且假設在必要時在這些類中使用諸如@Autowired或@Inject之類的注解
簡單的構造
在某些基于XML-Based的配置,我們想獲取上下文容器使用ClassPathXmlApplicationContext,現在你能夠使用@Configuration 類來實例化AnnotationConfigApplicationContext。
在MyService中添加一個printMessage()方法,實現類實現對應的方法。新建測試類進行測試
如前所述,AnnotationConfigApplicationContext不僅限于使用@Configuration類。任何@Component或JSR-330帶注釋的類都可以作為輸入提供給構造函數,如下例所示
使用register注冊IOC容器
你可以實例化AnnotationConfigApplicationContext通過使用無參數的構造器并且使用register方法進行注冊,它和AnnotationConfigApplicationContext帶參數的構造器起到的效果相同。
OtherConfig.class 和 AdditionalConfig.class 是使用@Component 標注的類。
允許scan()方法進行組件掃描
為了允許組件進行掃描,需要在@Configuration配置類添加@ComponentScan()注解,改造之前的AdditionalConfig類,如下:
@ComponentScan指定了基礎掃描包位于com.spring.annotation.config下,所有位于該包范圍內的bean都會被注冊進來,交由Spring管理。它就等同于基于XML-Based的注解:
AnnotationConfigApplicationContext中的scan()方法以允許相同的組件掃描功能,如以下示例所示:
為什么說@Configuration用法和@Component都能夠標注配置類?因為@Configuration的元注解就是@Component。
使用AnnotationConfigWebApplicationContext支持web容器
AnnotationConfigApplicationContext的一個WebApplicationContext的變化是使用AnnotationConfigWebApplicationContext。配置Spring ContextLoaderListener的servlet監聽器,Spring MVC的DispatcherServlet等時,可以使用此實現。以下web.xml代碼段配置典型的Spring MVC Web應用程序(請注意context-param和init-param的使用)
使用@Bean注解
@Bean 注解是一個方法級別的注解,能夠替換XML-Based中的標簽,@Bean注解同樣支持標簽支持的屬性,像是 init-method, destroy-method, autowiring。
定義一個Bean
與基礎概念中Bean的定義相同,讀者可以參考基礎概念部分進行了解,我們不在此再進行探討。
Bean的依賴
@Bean 注解可以有任意數量的參數來構建其依賴項,例如
接受生命周期回調
任何使用@Bean的注解都支持生命周期的回調,使用JSR-220提供的@PostConstruct和@PreDestory注解來實現。如果bean實現了InitializingBean,DisposableBean或者Lifecycle接口,他們的方法會由IOC容器回調。一些以Aware的實現接口(像是BeanFactoryAware,BeanNameAware, MessageSourceAware, ApplicationContextAware等)也支持回調。
@Bean注解支持特定的初始化和銷毀方法,就像XML-Based中的init-method和 destory-method中的bean屬性,下面這個例子證實了這一點
對于上面的例子,也可以手動調用init()方法,與上面的initMethod 方法等效
當你直接使用Java開發時,你可以使用對象執行任何操作,并且不必總是依賴于容器生命周期。
Bean的作用范圍
Spring包括@Scope注解能夠讓你指定Bean的作用范圍,Bean的Scope默認是單例的,也就是說@Bean標注的對象在IOC的容器中只有一個。你可以重寫@Scope的作用范圍,下面的例子說明了這一點,修改OtherConfig如下
每次嘗試獲取dependency1這個對象的時候都會重新生成一個新的對象實例。下面是Scope的作用范圍和解釋:
| Descriptionn | Scope |
singleton | 默認單例的bean定義信息,對于每個IOC容器來說都是單例對象 |
prototype | bean對象的定義為任意數量的對象實例 |
request | bean對象的定義為一次HTTP請求的生命周期,也就是說,每個HTTP請求都有自己的bean實例,它是在單個bean定義的后面創建的。僅僅在web-aware的上下文中有效 |
session | bean對象的定義為一次HTTP會話的生命周期。僅僅在web-aware的上下文中有效 |
application | bean對象的定義范圍在ServletContext生命周期內。僅僅在web-aware的上下文中有效 |
websocket | bean對象的定義為WebSocket的生命周期內。僅僅在web-aware的上下文中有效 |
@Scope和Scoped-proxy
Spring提供了一種通過scoped proxies與scoped依賴一起作用的方式。最簡單的在XML環境中創建代理的方式是通過<aop:scoped-proxy/>標簽。使用@Scope注解為在Java中配置bean提供了與proxyMode屬性相同的功能。默認是不需要代理的(ScopedProxyMode.NO),但是你需要指定ScopedProxyMode.TARGET_CLASS或者ScopedProxyMode.INTERFACES。
自定義Bean名稱
默認的情況下,配置類通過@Bean配置的默認名稱(方法名第一個字母小寫)進行注冊和使用,但是你可以更換@Bean的name為你想指定的名稱。修改AdditionalConfig 類
Bean的別名
有時候需要為單例的bean提供多個名稱,也叫做Bean的別名。Bean注解的name屬性接收一個Array數組。下面這個例子證實了這一點:
Bean的描述
有時,提供更詳細的bean描述信息會很有幫助(但是開發很少使用到)。為了增加一個對@Bean的描述,你需要使用到@Description注解
使用@Configuration注解
更多關于@Configuration 的詳細說明,請你參考我被面試官給虐懵了,竟然是因為我不懂Spring中的@Configuration
已經把@Configuration的注解說明的比較詳細了。
組成Java-Based環境配置的條件
Spring基于注解的配置能夠允許你自定義注解,同時能夠降低配置的復雜性。
使用@Import注解
就像在Spring XML文件中使用元素來幫助模塊化配置一樣,@Import 注解允許從另一個配置類加載@Bean定義,如下所示
現在,在實例化上下文時,不需要同時指定ConfigA.class 和 ConfigB.class ,只需要顯示提供ConfigB
這種方法簡化了容器實例化,因為只需要處理一個類,而不是要求你在構造期間記住可能大量的@Configuration類
有選擇性的包含@Configuration 類和@Bean 方法
選擇性的允許或者禁止@Configuration注解的類和@Bean注解的方法是很有用的,基于一些任意系統狀態。一個常見的例子是只有在Spring環境中啟用了特定的配置文件時才使用@Profile注釋激活bean。
@Profile注解也實現了更靈活的注解@Conditional,@Conditional 注解表明在注冊@Bean 之前應參考特定的Condition實現。
實現Condition接口就會提供一個matched方法返回true或者false
更多關于@Conditional 的示例,請參考
https://www.cnblogs.com/cxuanBlog/p/10960575.html
結合Java與XML配置
Spring @Configuration類能夠100%替換XML配置,但一些工具(如XML命名空間)仍舊是配置容器的首選方法,在這種背景下,使用XML使很方便的而且使剛需了。你有兩個選擇:使用以XML配置實例化容器為中心,例如:ClassPathXmlApplicationContext導入XML或者實例化以Java配置為中心的AnnotationConfigApplicationContext并提供ImportResource注解導入需要的XML配置。
將@Configuration聲明為普通的bean元素
請記住,@Configuration類存放的是容器中的bean定義信息,下面的例子中,我們將會創建一個@Configuration類并且加載了外部xml配置。下面展示了一個普通的Java配置類
下面是system-test-config.xml配置類的一部分
引入jdbc.properties建立數據庫連接
在system-test-config.xml中,AppConfig 對應的標簽沒有聲明id屬性,雖然這樣做是可以接受的,但是沒有必要,因為沒有其他bean引用它,并且不太可能通過名稱從容器中獲取它。同樣的,DataSource bean只是按類型自動裝配,因此不嚴格要求顯式的bean id。
使用<> 挑選指定的@Configuration類
因為@Configuration的原注解是@Component,所以@Configuration注解的類也能用于組件掃描,使用與前一個示例中描述的相同的方案,我們可以重新定義system-test-config.xml以利用組件掃描。請注意,在這種情況下,我們不需要顯式聲明<context:annotation-config />,因為<context:component-scan />啟用相同的功能。
@Configuration 類使用@ImportResource
在基于Java注解的配置類中,仍然可以使用少量的@ImportResource導入外部配置,最好的方式就是兩者結合,下面展示了一下Java注解結合XML配置的示例
Properties-config.xml
jdbc.properties
PS:本文來自作者投稿,原作者cxuan,以下是他的贊賞碼,如果你喜歡本文,歡迎給作者贊賞。感謝!同時,歡迎廣大作者向Hollis投稿哦~
Java工程師成神之路系列文章
在 GitHub 更新中,歡迎關注,歡迎star。
?直面Java第256期:jdk1.6對synchronized做了哪些優化?
成神之路第015期:設計模式:單例模式
深入并發第008期:到底什么是計算機內存模型?
- MORE | 更多精彩文章 -
谷歌和 Facebook 是如何給工程師定職級和薪水的?
IntelliJ IDEA 從入門到上癮教程,2019圖文版!
代碼潔癖的春天!Java 效率工具之 Lombok
為什么阿里巴巴要求謹慎使用ArrayList中的subList方法
如果你喜歡本文,
請長按二維碼,關注?Hollis.
轉發至朋友圈,是對我最大的支持。
好文章,我在看??
總結
以上是生活随笔為你收集整理的原创 | 一文了解那些和Spring Bean有关的那些注解!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东面试官:你是怎么理解 MySQL 的
- 下一篇: ZOJ 3702 Gibonacci n