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
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。