最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中Bean命名的方式總結(jié)

 更新時(shí)間:2023年12月03日 11:25:35   作者:dweizhao  
在?Spring?框架中,每個(gè)?bean?必須至少有一個(gè)唯一的名稱,這篇文章主要為大家詳細(xì)介紹了Spring中Bean命名的各種方式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在 Spring 框架中,每個(gè) bean 必須至少有一個(gè)唯一的名稱。Spring 遵循簡(jiǎn)單且默認(rèn)的命名策略來(lái)確定 bean 的名稱,無(wú)論我們使用 XML 配置還是基于Java代碼配置。本文將詳細(xì)討論這些策略。

1.使用@Component的默認(rèn)Bean命名

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

下面我我們聲明一個(gè)非常簡(jiǎn)單的bean,如下所示:

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

@Component
public class DemoBean { 

	//...
}

DemoBean使用@Component注解,當(dāng)我們從應(yīng)用程序上下文中檢索 bean 并打印其名稱時(shí),它會(huì)打印“ 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

在以上結(jié)果輸出中,我們可以看到 Spring 創(chuàng)建的基礎(chǔ)設(shè)施 bean,還有我們創(chuàng)建的beanappConfigdemoBean.

2.使用@Bean的默認(rèn)Bean命名

當(dāng)我們使用@Bean注解來(lái)創(chuàng)建一個(gè)新的bean時(shí),該bean將以創(chuàng)建它的方法命名。

讓我們通過(guò)一個(gè)示例來(lái)理解,我們創(chuàng)建兩個(gè)具有不同方法名稱的DemoBean類型的 bean 。

@Configuration
public class AppConfig {

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

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

當(dāng)我們運(yùn)行代碼并打印bean名稱時(shí),會(huì)輸出以下結(jié)果:

...
appConfig
demoBean
anotherDemoBean

3.帶有值的顯式 Bean 命名

對(duì)于所有的注解類型,都有一個(gè)默認(rèn)屬性名為"value",可以用一個(gè)值進(jìn)行初始化,作為用于標(biāo)識(shí)bean的名稱。

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

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

同樣@Bean注解有兩個(gè)屬性namevalue,可以為bean定義一個(gè)顯式名稱。

@Configuration
public class AppConfig {

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

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

當(dāng)我們運(yùn)行代碼并打印bean名稱時(shí),會(huì)輸出以下結(jié)果:

...
appConfig
newBeanName
anotherNewBeanName

4.Bean 名稱別名:多個(gè) Bean 名稱

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

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

現(xiàn)在,當(dāng)打印 bean 的名稱時(shí),它仍然是 "newBeanName"。但是當(dāng)我們打印 bean 的名稱別名時(shí),我們會(huì)得到額外的名稱,即 "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的命名也可以進(jìn)行自定義。為了進(jìn)行自定義名稱生成,我們可以定義一個(gè)類,繼承 AnnotationBeanNameGenerator 并在 @ComponentScan 注解中指定該類的名稱。

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

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

以下示例會(huì)返回由小寫的簡(jiǎn)單類名與唯一標(biāo)識(shí)符連接而成的 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

到此這篇關(guān)于Spring中Bean命名的方式總結(jié)的文章就介紹到這了,更多相關(guān)Spring Bean命名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis 新增返回id的實(shí)現(xiàn)

    mybatis 新增返回id的實(shí)現(xiàn)

    Mybatis插入數(shù)據(jù)時(shí),可以通過(guò)兩種方式返回生成的ID,兩種方式都需要在實(shí)體類中提供userId的getter和setter方法,本文就詳細(xì)的介紹一下這兩種方法,感興趣的可以了解一下
    2024-09-09
  • Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn)

    Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn)

    這篇文章主要介紹了Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • javascript最新2020經(jīng)典面試題

    javascript最新2020經(jīng)典面試題

    這篇文章主要介紹了javascript最新2020經(jīng)典面試題的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • MyBatisPlus分頁(yè)插件IPage用法實(shí)現(xiàn)

    MyBatisPlus分頁(yè)插件IPage用法實(shí)現(xiàn)

    本文主要介紹了MyBatisPlus分頁(yè)插件IPage用法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Java中的StringUtils引入及使用示例教程

    Java中的StringUtils引入及使用示例教程

    這篇文章主要介紹了Java中的StringUtils引入及使用示例教程,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),介紹了java中StringUtils用法,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • Springboot中前端向后端傳遞數(shù)據(jù)的幾種方式

    Springboot中前端向后端傳遞數(shù)據(jù)的幾種方式

    在前端和后端的交互中,前端需要向后端傳遞數(shù)據(jù),常見(jiàn)的數(shù)據(jù)傳遞方式包括表單提交、URL參數(shù)、JSON請(qǐng)求等,本文將介紹常見(jiàn)的幾種數(shù)據(jù)傳遞方式,并說(shuō)明如何在SpringBoot中實(shí)現(xiàn)這些方式,需要的朋友可以參考下
    2025-08-08
  • Java多線程Thread , Future , Callable , FutureTask的使用

    Java多線程Thread , Future , Callable ,

    本文主要介紹了Java多線程Thread , Future , Callable , FutureTask的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 最新評(píng)論

    新津县| 灌阳县| 康保县| 宁南县| 璧山县| 乐平市| 大兴区| 祁连县| 子长县| 徐州市| 镇远县| 漳州市| 孟村| 云安县| 尤溪县| 大埔区| 池州市| 双江| 惠东县| 扎囊县| 洛浦县| 齐齐哈尔市| 白水县| 元氏县| 蒙自县| 酉阳| 玉屏| 璧山县| 龙海市| 吉木萨尔县| 嵩明县| 吉水县| 望城县| 昌平区| 昌吉市| 沙坪坝区| 松阳县| 策勒县| 聊城市| 乐陵市| 百色市|