Spring编程注册Bean时如何获取BeanNameGenerator生成统一名称
获取BeanNameGenerator实例的实现方案
你可以根据自己的使用场景选择对应方式,都能保证生成的Bean名称和Spring全局命名规则对齐:
直接使用Spring默认命名生成器(和
@Component/@Service等注解扫描的命名逻辑完全一致)
Spring 5.2及以上版本中,默认的AnnotationBeanNameGenerator提供了线程安全的静态单例实例,直接引用即可,不需要依赖容器状态:// 获取默认Bean名称生成器 BeanNameGenerator nameGenerator = AnnotationBeanNameGenerator.INSTANCE; // 生成符合规范的Bean名称 String beanName = nameGenerator.generateBeanName(beanDefinition, applicationContext); // 执行Bean注册 ((GenericApplicationContext) applicationContext).registerBeanDefinition(beanName, beanDefinition);如果是Spring 5.2之前的版本,没有提供静态单例常量,直接
new AnnotationBeanNameGenerator()即可,这个类本身无状态,多次创建也不会有额外开销。这种方式适合容器还没完成刷新、没法从容器取Bean的阶段(比如Bean定义注册后置处理器的执行阶段)。复用容器当前使用的BeanNameGenerator实例(适配自定义命名规则场景)
如果你全局自定义过Bean命名规则(比如Spring Boot启动类指定了nameGenerator属性,或者手动注册过自定义的BeanNameGenerator),可以直接从已完成刷新的容器中按类型获取,保证和全局规则完全一致:BeanNameGenerator nameGenerator = applicationContext.getBean(BeanNameGenerator.class);注意这个方式要求ApplicationContext已经完成刷新流程,否则会抛出找不到Bean的异常。
补充说明:不要随意手动创建自定义规则的BeanNameGenerator实例,除非你明确需要独立于全局规则的命名逻辑,否则上述两种方式都能保证命名规则和容器现有逻辑统一,避免出现Bean重名冲突、名称不符合预期的问题。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

