当前位置: 首页 > 知识库问答 >
问题:

在Spring中使用@Bean和@限定符注释解析Bean名称

汲睿
2023-03-14

我刚刚发现了一种我无法理解的Spring的行为。我使用的是Spring Boot 1.5。十、

在一个配置类中,我声明了两个不同的bean。

@Configuration
class Config {
    @Bean("regularRestTemplate")
    public RestTemplate regularRestTemplate(String toLog) {
        return new RestTemplateBuilder().setConnectTimeout(100)
                                        .setReadTimeout(100)
                                        .additionalInterceptors((request, body, execution) -> {
                                            log.info("Inside the interceptor {}", toLog);
                                            return execution.execute(request, body);
                                        })
                                        .build();
    }
    @Bean("exceptionalRestTemplate")
    public RestTemplate regularRestTemplate() {
        return new RestTemplateBuilder().setConnectTimeout(100)
                                        .setReadTimeout(100)
                                        .build()
    }
}

然后,我有一个类,它应该使用名为exceptionalRestTemplate的bean。

@Component
class Client {
    private RestTemplate restTemplate;
    @Autowired
    public Client(@Qualifier("exceptionalRestTemplate") RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    // Code that uses the injected rest template
}

因为我指定了我想要使用@Qualifer注释注入的bean的名称,所以我希望Spring注入名为异常alRestTem板的bean。但是,在注入过程中实际上使用了名为正规的RESTTem板的bean。

事实证明,问题在于在配置类中声明bean的方法的名称。两者都是colled常规的。更改第二种方法名称,解决问题。

我的问题是,为什么?我知道Spring使用带有@Bean@Component@Service等注释的类和方法的名称。。。注释为分辨率映射内的Java对象命名。但是,我认为在这些注释中给出一个名称会覆盖这种行为。

有人告诉我发生了什么事吗?


共有1个答案

夏晋
2023-03-14

Bean限定符和Bean名称是不同的含义。您对新bean进行了限定,但试图覆盖它(参数无关紧要)。在应用程序中,不能重写bean,因此只有第一个bean

你可以检查这个“理论”。在配置中添加参数

spring.main.allow-bean-definition-overriding=true

并再次启动您的应用程序。之后,你就只有第二颗豆子了。

这是对碰撞的解释。但是解决方案是将豆子分离成不同的配置。

 类似资料:
  • 假设我有一个类,,其构造函数采用目标名称。为了对这个类进行CDI验证,我可以编写一个类似这样的生成器,它检查注入点以找到一个名为的注释(不是限定符,因为生成器方法不能用它可以生成的所有可能的主题名值进行注释): 但是假设这个类很重,但是线程安全,因此应该尽可能多地共享。这意味着我希望任何看起来像的注入站点共享以FooBar作为名称构建的的相同实例。 我们不能将producer方法标记为Applic

  • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!

  • 我已经使用Spring几十年了,但以前从未遇到过这个用例。 是否有方法注入所有带特定注释的bean,例如,所有带服务的bean或所有带自定义注释的bean? 我唯一的想法是注入上下文,获取所有bean并手动过滤。如果这是唯一的方法,Spring是否公开了一种递归扫描类层次结构以查找(元)注释的方法(因为大多数Spring注释都可以用作元注释)?

  • 我在JavaConfig中发现了这一点,它看起来如下所示: 如果我的假设错了,请纠正我。 3)我需要将我的类注释为@Component(Scope=“Workflow”)。同样,xml配置将如下所示:

  • 本文向大家介绍Spring @Bean注解配置及使用方法解析,包括了Spring @Bean注解配置及使用方法解析的使用技巧和注意事项,需要的朋友参考一下 使用说明 这个注解主要用在方法上,声明当前方法体中包含了最终产生 bean 实例的逻辑,方法的返回值是一个 Bean。这个 bean 会被 Spring 加入到容器中进行管理,默认情况下 bean 的命名就是使用了 bean 注解的方法名。@B

  • 我在Spring boot应用程序中不断遇到冲突BeanDefinitionException错误。我不完全确定如何解决这个问题,我有几个带注释的类来帮助设置Thymeleaf、Spring Security和Web。为什么应用程序尝试设置homeController两次?(它在哪里尝试这样做?) 错误是: 我的spring boot主应用程序初始值设定项: 我的数据库配置文件: 我的Thymel