Spring Bean五种命名方式分享

重生 Spring 发布时间:2024-01-16 22:11:54 阅读数:14190 1
下文笔者讲述Spring Bean的五种命名方式分享,如下所示

SPring命名简介

我们都知道,在Spring框架中
    每个bean至少拥有一个唯一的名称
    spring拥有默认的命名策略,也可以指定命名
==============================================
下文笔者讲述Spring中五种命名简介,如下所示

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

默认情况下
   Spring会使用声明Bean类型的简单名称
    将第一个字母改为小写
     并使用生成的值来命名Bean
     此种方式适用于所有定型注解(@Service、@Repository等)
@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

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

当我们使用@Bean注解
   创建一个新的bean时
    该bean将以创建它的方法命名 
@Configuration
public class AppConfig {

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

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

...
appConfig
demoBean
anotherDemoBean

3.带有值的显式Bean命名

所有的注解类型
 都有一个默认属性名为"value"
  可以用一个值进行初始化
   用于标识bean的名称
@Component(value = "newBeanName")
public class DemoBean {
 //...
}

@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注解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() 方法
来定义自定义的名称生成逻辑
 
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
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/Spring/202401/7678.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者