成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring 注解@Bean使用方式,你都知道嗎?

開發 架構
要聲明Bean,可以使用@Bean注釋對方法進行注釋。可以使用此方法在ApplicationContext中注冊Bean定義,其類型指定為該方法的返回值。默認情況下,Bean名與方法名相同。

@Bean是方法級注釋,是XML <bean/>元素的直接類比。注解支持<bean/>提供的一些屬性,例如:

  • init-method
  • destroy-method
  • autowiring
  • name.

你可以在@Configuration或@Component類中使用@Bean注釋。

聲明Bean

要聲明bean,可以使用@Bean注釋對方法進行注釋。可以使用此方法在ApplicationContext中注冊bean定義,其類型指定為該方法的返回值。默認情況下,bean名與方法名相同。下面的例子展示了一個@Bean方法聲明:

@Configuration
public class AppConfig {

@Bean
public TransferServiceImpl transferService() {
return new TransferServiceImpl();
}
}

前面的配置與下面的Spring XML完全等效:

<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

這兩個聲明都使一個名為transferService的bean在ApplicationContext中可用,綁定到類型為TransferServiceImpl的對象實例,如下圖所示:

transferService -> com.acme.TransferServiceImpl

你也可以使用默認方法來定義bean。這允許通過在默認方法上實現帶有bean定義的接口來組合bean配置。

public interface BaseConfig {

@Bean
default TransferServiceImpl transferService() {
return new TransferServiceImpl();
}
}

@Configuration
public class AppConfig implements BaseConfig {
}

你還可以用接口(或基類)返回類型聲明@Bean方法,如下例所示:

@Configuration
public class AppConfig {

@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}

然而,這將高級類型預測的可見性限制為指定的接口類型(TransferService)。然后,只有在實例化了受影響的單例bean之后,容器才知道完整類型(TransferServiceImpl)。非惰性單例bean根據其聲明順序進行實例化,因此你可能會看到不同的類型匹配結果,這取決于另一個組件何時嘗試通過非聲明類型進行匹配(例如@Autowired TransferServiceImpl,它只在transferServicebean實例化后才解析)。

Bean依賴

一個@Bean注釋的方法可以有任意數量的參數來描述構建該Bean所需的依賴關系。例如,如果我們的TransferService需要一個AccountRepository,我們可以用一個方法參數來實現該依賴關系,如下例所示:

@Configuration
public class AppConfig {

@Bean
public TransferService transferService(AccountRepository accountRepository) {
return new TransferServiceImpl(accountRepository);
}
}

解析機制與基于構造函數的依賴注入非常相似。

Bean生命周期

使用@Bean注釋定義的任何類都支持常規的生命周期回調,并且可以使用JSR-250中的@PostConstruct@PreDestroy注釋。

也完全支持常規的Spring生命周期回調。如果bean實現InitializingBean、DisposableBean或Lifecycle,那么容器將調用它們各自的方法。

還完全支持一組標準的*Aware接口(如BeanFactoryAware、BeanNameAware、MessageSourceAware、ApplicationContextAware等)。

@Bean注釋支持指定任意的初始化和銷毀回調方法,就像Spring XML在Bean元素上的init方法和destroy方法屬性一樣,如下例所示:

public class BeanOne {

public void init() {
// initialization logic
}
}

public class BeanTwo {

public void cleanup() {
// destruction logic
}
}

@Configuration
public class AppConfig {

@Bean(initMethod = "init")
public BeanOne beanOne() {
return new BeanOne();
}

@Bean(destroyMethod = "cleanup")
public BeanTwo beanTwo() {
return new BeanTwo();
}
}

默認情況下,使用Java配置定義的具有公共close或shutdown方法的bean會自動使用銷毀回調進行登記。如果你有一個公共的close或shutdown方法,并且不希望在容器關閉時調用它,那么可以將@Bean(destroyMethod="")添加到Bean定義中,以禁用默認(推斷)模式。

public class Main {

static class Person {
public void close() {
System.out.println("close") ;
}
public void shutdown() {
System.out.println("shutdown") ;
}
}
@Configuration
static class AppConfig {
@Bean
// @Bean(destroyMethod = "") 這樣就禁用了關閉的操作(closeshutdown
public Person person() {
return new Person() ;
}
}

public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class) ;
context.close() ;
}

}

注意:如果一個類中既有close方法又有shutdown方法,那么只有close方法生效。

以前面示例中的BeanOne為例,在構造過程中直接調用init()方法同樣有效,如下面的例子所示:

@Configuration
public class AppConfig {

@Bean
public BeanOne beanOne() {
BeanOne beanOne = new BeanOne();
beanOne.init();
return beanOne;
}
}

當你直接在Java中工作時,你可以對對象執行任何你喜歡的操作,而不必總是依賴于容器生命周期。

Bean作用域

Spring包含@Scope注釋,以便您可以指定bean的范圍。

你可以指定使用@Bean注釋定義的Bean應該具有特定的作用域。可以使用Bean scopes部分中指定的任何標準作用域。

默認作用域是singleton,但您可以使用@Scope注釋來覆蓋它,如下例所示:

@Configuration
public class MyConfiguration {

@Bean
@Scope("prototype")
public Encryptor encryptor() {
// ...
}
}

@Scope and scoped-proxy

Spring通過作用域代理提供了一種方便的方式來處理作用域依賴。在使用XML配置時,創建這樣一個代理的最簡單方法是<aop:scope -proxy/>元素。在Java中配置bean時,使用@Scope注解可以為proxyMode屬性提供類似的支持。默認值是ScopedProxyMode.DEFAULT,它通常表示不應該創建scoped proxy,除非在組件掃描指令級別配置了不同的DEFAULT。你可以指定
ScopedProxyMode.TARGET_CLASS ScopedProxyMode。接口或ScopedProxyMode.NO。

如果你使用Java將XML參考文檔(參見“限定范圍的代理”)中的限定范圍代理示例移植到我們的@Bean,它類似于以下內容:

// an HTTP Session-scoped bean exposed as a proxy
@Bean
@SessionScope
public UserPreferences userPreferences() {
return new UserPreferences();
}

@Bean
public Service userService() {
UserService service = new SimpleUserService();
// a reference to the proxied userPreferences bean
service.setUserPreferences(userPreferences());
return service;
}

自定義Bean命名

默認情況下,配置類使用@Bean方法的名稱作為生成的Bean的名稱。但是,可以使用name屬性覆蓋此功能,如以下示例所示:

@Configuration
public class AppConfig {

@Bean("myThing")
public Thing thing() {
return new Thing();
}
}

Bean別名

正如Naming Beans中所討論的,有時需要為單個bean提供多個名稱,也稱為bean別名。@Bean注釋的name屬性接受用于此目的的String數組。以下示例顯示了如何為bean設置多個別名:

@Configuration
public class AppConfig {

@Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"})
public DataSource dataSource() {
// instantiate, configure and return DataSource bean...
}
}

Bean描述

有時,提供一個bean的更詳細的文本描述是有幫助的。當bean被公開(可能是通過JMX)用于監視目的時,這可能特別有用。

要向@Bean添加描述,可以使用@Description注釋,如下例所示:

@Configuration
public class AppConfig {

@Bean
@Description("Provides a basic example of a bean")
public Thing thing() {
return new Thing();
}
}


責任編輯:姜華 來源: 今日頭條
相關推薦

2023-04-28 12:37:59

Spring@Bean使用方式

2023-08-29 09:31:01

Scrapy網頁爬蟲

2019-02-12 11:15:15

Spring設計模式Java

2020-02-20 08:30:49

OSPF網絡協議路由協議

2024-04-28 08:20:52

Controller接口URL

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2023-02-15 08:12:19

http超時過濾器

2020-09-11 06:39:29

ThreadLocal線程

2023-08-30 07:39:16

PawSQL數據庫

2020-09-28 11:14:57

線程數據語言

2024-01-18 07:46:53

HookReact回調函數

2021-11-17 11:03:14

Python代碼語法

2016-01-11 09:48:07

2021-08-05 18:21:29

Autowired代碼spring

2024-02-05 12:08:07

線程方式管理

2023-02-13 08:10:40

Gateway網關Spring

2020-11-04 17:35:39

網絡安全漏洞技術

2019-07-08 10:18:38

MPLSIP數據

2023-07-04 08:48:24

靜態代碼分析工具

2016-03-18 19:03:35

認知計算IBM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91在线视频免费观看 | 偷派自拍| 亚洲一区二区久久久 | 国产精品欧美一区二区 | 久久久青草 | 日韩免费高清视频 | 亚洲精品久久久一区二区三区 | 欧美日韩亚洲一区 | 亚洲精品在线免费 | 亚洲成人福利 | 羞羞的视频免费观看 | 丁香婷婷在线视频 | 日韩性生活网 | 国产97碰免费视频 | 免费在线观看成人 | www.久| 中文字幕欧美日韩一区 | 久久精品无码一区二区三区 | 日韩欧美中文字幕在线视频 | 色av一区二区三区 | 欧洲亚洲视频 | 亚洲视频一区在线观看 | 在线播放国产一区二区三区 | 成人不卡在线 | 久久久久久久久久久久久久av | 一级免费视频 | 黄色免费在线网址 | 在线观看av网站永久 | 亚洲国产精品91 | 岛国在线免费观看 | 91视视频在线观看入口直接观看 | 成年人网站在线观看视频 | 日本涩涩视频 | 99久久日韩精品免费热麻豆美女 | 久久9视频 | 欧美一级免费观看 | 本道综合精品 | 欧美日韩久久 | 欧美a在线观看 | 欧美日韩不卡合集视频 | 国产传媒在线观看 |