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

Spring Bean 命名各種方式,看這一篇就夠了

開發 架構
Spring會使用聲明Bean類型的簡單名稱,將第一個字母改為小寫,并使用生成的值來命名Bean。此種方式適用于所有定型注解(@Service、@Repository 等)。

在 Spring 框架中,每個 bean 必須至少有一個唯一的名稱。Spring 遵循簡單且默認的命名策略來確定 bean 的名稱,無論我們使用 XML 配置

還是基于Java代碼配置。本文將詳細討論這些策略。

1.使用@Component的默認Bean命名

默認情況下,Spring會使用聲明Bean類型的簡單名稱,將第一個字母改為小寫,并使用生成的值來命名Bean。此種方式適用于所有定型注解(@Service@Repository 等)。

下面我我們聲明一個非常簡單的bean,如下所示:

@Configuration
@ComponentScan
public class AppConfig {
 //...
}

@Component
public class DemoBean { 

 //...
}

DemoBean使用@Component注解,當我們從應用程序上下文中檢索 bean 并打印其名稱時,它會打印“ demoBean ”。

var applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);

程序輸出:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
appConfig
demoBean

在以上結果輸出中,我們可以看到 Spring 創建的基礎設施 bean,還有我們創建的beanappConfigdemoBean.

2. 使用@Bean的默認Bean命名

當我們使用@Bean注解來創建一個新的bean時,該bean將以創建它的方法命名。

讓我們通過一個示例來理解,我們創建兩個具有不同方法名稱的DemoBean類型的 bean 。

@Configuration
public class AppConfig {

  @Bean
  DemoBean demoBean(){
    return new DemoBean();
  }

  @Bean
  DemoBean anotherDemoBean(){
    return new DemoBean();
  }
}

當我們運行代碼并打印bean名稱時,會輸出以下結果:

...
appConfig
demoBean
anotherDemoBean

3. 帶有值的顯式 Bean 命名

對于所有的注解類型,都有一個默認屬性名為"value",可以用一個值進行初始化,作為用于標識bean的名稱。

@Component(value = "newBeanName")
public class DemoBean {
 //...
}

注意,@Component(value = "newBeanName") 等同于 @Component("newBeanName")。它們產生一樣的結果。

同樣@Bean注解有兩個屬性name  value,可以為bean定義一個顯式名稱。

@Configuration
public class AppConfig {

  @Bean(name = "newBeanName")
  DemoBean demoBean(){
    return new DemoBean();
  }

  @Bean(value = "anotherNewBeanName")
  DemoBean anotherDemoBean(){
    return new DemoBean();
  }
}

當我們運行代碼并打印bean名稱時,會輸出以下結果:

...
appConfig
newBeanName
anotherNewBeanName

4. Bean 名稱別名:多個 Bean 名稱

@Bean 注解的 name 或 value 屬性可以指定一個值數組,用于引用 bean 的名稱。當這樣做時,數組中的第一個值將成為主要名稱,而其他值將成為別名。

@Bean(value = {"newBeanName", "newBeanName-1", "newBeanName-2"})
DemoBean demoBean(){
  return new DemoBean();
}

現在,當打印 bean 的名稱時,它仍然是 "newBeanName"。但是當我們打印 bean 的名稱別名時,我們會得到額外的名稱,即 "newBeanName-1" 和 "newBeanName-2"。

var applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);

var demoBean = applicationContext.getBeansOfType(DemoBean.class);

demoBean.forEach((k, v) -> {
  var aliases = applicationContext.getAliases(k);
  if (aliases.length > 0) {
    Arrays.stream(aliases).forEach(System.out::println);
  }
});

輸出

...
appConfig
newBeanName
newBeanName-2
newBeanName-1

5.生成自定義Bean名稱

與Spring中的所有功能類似,bean的命名也可以進行自定義。為了進行自定義名稱生成,我們可以定義一個類,繼承 AnnotationBeanNameGenerator 并在 @ComponentScan 注解中指定該類的名稱。

@Configuration
@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class AppConfig {
 //...
}

接下來,我們通過在 CustomBeanNameGenerator 類中重寫 buildDefaultBeanName() 方法來定義自定義的名稱生成邏輯。

以下示例會返回由小寫的簡單類名與唯一標識符連接而成的 bean 名稱。

public class CustomBeanNameGenerator extends AnnotationBeanNameGenerator {

  @Override
  protected String buildDefaultBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
    var beanName = definition.getBeanClassName()
      .substring(definition.getBeanClassName().lastIndexOf(".") + 1)
      .toLowerCase(Locale.ROOT);
    var uid = UUID.randomUUID().toString().replace("-","").substring(0,8);
    return beanName + "-" + uid;
  }
}

輸出

appConfig
demobean-889ed00b

總結

在本Spring教程中,我們學習了5種bean命名策略希望對你有所幫助。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-02-18 16:20:03

Redis ANSI C語言日志型

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2022-08-01 11:33:09

用戶分析標簽策略

2023-09-11 08:13:03

分布式跟蹤工具

2021-04-08 07:37:39

隊列數據結構算法

2020-07-03 08:21:57

Java集合框架

2019-05-14 09:31:16

架構整潔軟件編程范式

2023-10-17 08:15:28

API前后端分離

2018-05-22 08:24:50

PythonPyMongoMongoDB

2024-09-23 08:00:00

消息隊列MQ分布式系統

2017-03-11 22:19:09

深度學習

2022-04-07 10:39:21

反射Java安全

2023-11-18 09:30:42

模型AI

2022-05-19 08:28:19

索引數據庫

2019-04-01 10:43:59

Linux問題故障

2020-10-18 07:32:06

SD-WAN網絡傳統廣域網

2022-07-06 12:07:06

Python函數式編程

2020-10-21 14:12:02

Single Sign

2023-11-06 07:21:13

內存結構Jvm
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲人成人一区二区在线观看 | 在线观看亚洲 | 日日操夜夜操天天操 | 亚洲激情在线观看 | 亚洲精品一区中文字幕 | 五月婷亚洲 | 免费看a | 久久久久久久国产 | 毛片网站在线观看视频 | 欧美性猛交一区二区三区精品 | 国产永久免费 | 91视频一区 | www.国产精品 | 91免费观看在线 | 好姑娘高清在线观看电影 | 精品国产乱码久久久久久闺蜜 | 一区二区在线免费观看 | 亚洲综合色自拍一区 | 久久精品久久久 | 国产在线观看一区二区三区 | 91精品在线播放 | 国产成人99久久亚洲综合精品 | 台湾a级理论片在线观看 | 午夜无码国产理论在线 | www.午夜| 综合网视频 | 国产欧美一区二区三区在线看 | 欧美在线观看一区二区 | 亚洲一区二区免费 | 午夜影院视频在线观看 | 波多野结衣先锋影音 | 日韩精品成人 | 日韩中文一区二区三区 | 精品欧美激情在线观看 | 精品免费国产一区二区三区四区介绍 | 午夜影院网站 | 欧美激情精品久久久久久 | 一区二区三区观看视频 | 久久亚洲国产精品 | 国产精品18hdxxxⅹ在线 | 国产在线精品一区二区三区 |