日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-12-04 09:19:40 266觀看
導讀在 Spring 框架中,每個 bean 必須至少有一個唯一的名稱。Spring 遵循簡單且默認的命名策略來確定 bean 的名稱,無論我們使用 XML 配置還是基于Java代碼配置。本文將詳細討論這些策略。1.使用@Component的默認Bean命名默

在 Spring 框架中,每個 bean 必須至少有一個唯一的名稱。Spring 遵循簡單且默認的命名策略來確定 bean 的名稱,無論我們使用 XML 配置Oed28資訊網——每日最新資訊28at.com

還是基于Java代碼配置。本文將詳細討論這些策略。Oed28資訊網——每日最新資訊28at.com

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

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

下面我我們聲明一個非常簡單的bean,如下所示:Oed28資訊網——每日最新資訊28at.com

@Configuration@ComponentScanpublic class AppConfig { //...}@Componentpublic class DemoBean {  //...}

DemoBean使用@Component注解,當我們從應用程序上下文中檢索 bean 并打印其名稱時,它會打印“ demoBean ”。Oed28資訊網——每日最新資訊28at.com

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

程序輸出:Oed28資訊網——每日最新資訊28at.com

org.springframework.context.annotation.internalConfigurationAnnotationProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalCommonAnnotationProcessororg.springframework.context.annotation.internalPersistenceAnnotationProcessororg.springframework.context.event.internalEventListenerProcessororg.springframework.context.event.internalEventListenerFactoryappConfigdemoBean

在以上結果輸出中,我們可以看到 Spring 創建的基礎設施 bean,還有我們創建的beanappConfigdemoBean.Oed28資訊網——每日最新資訊28at.com

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

當我們使用@Bean注解來創建一個新的bean時,該bean將以創建它的方法命名。Oed28資訊網——每日最新資訊28at.com

讓我們通過一個示例來理解,我們創建兩個具有不同方法名稱的DemoBean類型的 bean 。Oed28資訊網——每日最新資訊28at.com

@Configurationpublic class AppConfig {  @Bean  DemoBean demoBean(){    return new DemoBean();  }  @Bean  DemoBean anotherDemoBean(){    return new DemoBean();  }}

當我們運行代碼并打印bean名稱時,會輸出以下結果:Oed28資訊網——每日最新資訊28at.com

...appConfigdemoBeananotherDemoBean

3. 帶有值的顯式 Bean 命名

對于所有的注解類型,都有一個默認屬性名為"value",可以用一個值進行初始化,作為用于標識bean的名稱。Oed28資訊網——每日最新資訊28at.com

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

注意,@Component(value = "newBeanName") 等同于 @Component("newBeanName")。它們產生一樣的結果。Oed28資訊網——每日最新資訊28at.com

同樣@Bean注解有兩個屬性name  value,可以為bean定義一個顯式名稱。Oed28資訊網——每日最新資訊28at.com

@Configurationpublic class AppConfig {  @Bean(name = "newBeanName")  DemoBean demoBean(){    return new DemoBean();  }  @Bean(value = "anotherNewBeanName")  DemoBean anotherDemoBean(){    return new DemoBean();  }}

當我們運行代碼并打印bean名稱時,會輸出以下結果:Oed28資訊網——每日最新資訊28at.com

...appConfignewBeanNameanotherNewBeanName

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

@Bean 注解的 name 或 value 屬性可以指定一個值數組,用于引用 bean 的名稱。當這樣做時,數組中的第一個值將成為主要名稱,而其他值將成為別名。Oed28資訊網——每日最新資訊28at.com

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

現在,當打印 bean 的名稱時,它仍然是 "newBeanName"。但是當我們打印 bean 的名稱別名時,我們會得到額外的名稱,即 "newBeanName-1" 和 "newBeanName-2"。Oed28資訊網——每日最新資訊28at.com

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);  }});

輸出Oed28資訊網——每日最新資訊28at.com

...appConfignewBeanNamenewBeanName-2newBeanName-1

5.生成自定義Bean名稱

與Spring中的所有功能類似,bean的命名也可以進行自定義。為了進行自定義名稱生成,我們可以定義一個類,繼承 AnnotationBeanNameGenerator 并在 @ComponentScan 注解中指定該類的名稱。Oed28資訊網——每日最新資訊28at.com

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

接下來,我們通過在 CustomBeanNameGenerator 類中重寫 buildDefaultBeanName() 方法來定義自定義的名稱生成邏輯。Oed28資訊網——每日最新資訊28at.com

以下示例會返回由小寫的簡單類名與唯一標識符連接而成的 bean 名稱。Oed28資訊網——每日最新資訊28at.com

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;  }}

輸出Oed28資訊網——每日最新資訊28at.com

appConfigdemobean-889ed00b

總結

在本Spring教程中,我們學習了5種bean命名策略希望對你有所幫助。Oed28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-37241-0.htmlSpring Bean 命名各種方式,看這一篇就夠了

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 《輻射》真人劇集新海報:女主角路西踏出避難所

下一篇: 使用Ruff改善Python編程風格

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 山丹县| 宜君县| 卓尼县| 静海县| 南宫市| 临漳县| 荥阳市| 南城县| 靖边县| 永川市| 通河县| 班玛县| 秦安县| 南川市| 前郭尔| 襄城县| 武邑县| 理塘县| 大兴区| 喜德县| 通山县| 石台县| 怀来县| 贵州省| 台东县| 卫辉市| 通山县| 吴川市| 大姚县| 凌云县| 韩城市| 辽中县| 陈巴尔虎旗| 梁山县| 内乡县| 大化| 双桥区| 康平县| 康乐县| 兴化市| 安国市|