Spring Bean五种命名方式分享
下文笔者讲述Spring Bean的五种命名方式分享,如下所示
@Bean注解有两个属性name 和 value
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
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


