【问题标题】:How do I specify a BeanNamingStrategy with Spring Boot?如何使用 Spring Boot 指定 BeanNamingStrategy?
【发布时间】:2015-10-12 11:00:48
【问题描述】:

我想在使用 Spring Boot 配置我的应用程序时指定一个自定义 BeanNamingStrategy。默认情况下,Spring Boot 使用MethodNameStrategy,即BeanNamingStrategy

我想这样做的原因是因为我有抽象的父类,我的消费者将为其创建配置子类。父类中的方法彼此具有相同的名称,因此不会为子类的不同实现注册。我的自定义 BeanNamingStrategy 会将配置类的简单名称附加到某些 bean 名称。

通常在 Spring 应用程序中,您可以使用 ApplicationContextsetBeanNamingStrategy 方法传递自定义 BeanNamingStrategy。但是,如果 Spring Boot 正在创建 ApplicationContext,我该怎么做呢?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    SpringApplicationBuilder 有一个方法beanNameGenerator(),可以让你传入一个自定义生成器。

    请参阅 Spring Boot 参考中的 22.3 Fluent builder API,了解如何使用 fluent API。


    不幸的是,这对您没有帮助,因为这仅适用于 @Component 样式的类注释,而不适用于 @Bean 方法,其名称 are hard coded 使用 this method

    【讨论】:

    • 谢谢,但 BeanNameGenerator 似乎没有被 @Bean-annotated 方法调用(在 @Configuration-annotated 类中),仅适用于 @Component-annotated 类和 @987654335 @-annotated 类本身。是否调用了不同的对象来为带有 @Bean 注释的方法生成 bean 名称?
    • @Kidburla 这很奇怪,因为负责评估@Configuration 类的ConfigurationClassPostProcessor 清楚地知道BeanNameGeneratordocs.spring.io/spring/docs/current/javadoc-api/org/…
    • 您已链接的 javadoc 明确指出“请注意,此策略适用于 Bean 方法”。我的理解是BeanNamingStrategy 用于Bean 方法,而BeanNameGenerator 仅用于从类级别的注释中解析bean。
    • 看起来从 Bean 方法确定 bean 名称的策略现在是硬编码的 :-( 不确定是否有任何方法可以覆盖它:grepcode.com/file/repo1.maven.org/maven2/org.springframework/…
    • @Kidburla 在我看来像是你应该要求的功能
    【解决方案2】:

    您还可以在主 Spring Boot 应用程序类上使用 @ComponentScan(nameGenerator = ...) 注解:

    @SpringBootApplication
    @ComponentScan(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    

    【讨论】:

    • 注意:使用这种方法时,您可能会遇到@SpringBootTest@WebMvcTest 的问题。如果您确实遇到问题,请参阅this question 以获取帮助/更多详细信息。
    • 似乎更好的方法是直接使用@SpringBootApplication(nameGenerator = ...),这完全避免了这个问题。有关详细信息,请参阅here
    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2016-07-10
    • 2023-02-21
    • 2013-11-05
    • 2019-06-25
    相关资源
    最近更新 更多