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

在Spring java配置中调用@Bean注释方法

林威
2023-03-14

我很好奇spring注入是如何用@bean注释处理调用方法的。如果我将@bean注释放在一个方法上,并返回一个实例,我理解这会告诉spring通过调用该方法并获得返回的实例来创建一个bean。但是,有时该bean必须用于连接其他bean或设置其他代码。通常的方法是调用@bean带注释的方法来获得一个实例。我的问题是,为什么这不会导致bean的多个实例浮动?

例如,参见下面的代码(摘自另一个问题)。entrypoint()方法是用@bean注释的,因此我想spring将创建一个BasicAuthenticationentrypoint的新实例作为bean。然后,我们在configure块中再次调用entrypoint(),但entrypoint()似乎返回了bean实例,并且没有多次调用(我尝试了日志记录,只得到了一个日志条目)。我们可能会在配置的其他部分多次调用entrypoint(),并且总是得到同一个实例。我对此的理解正确吗?spring是否对使用@bean注释的方法进行了一些神奇的重写?

@Bean
public BasicAuthenticationEntryPoint entryPoint() {
    BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
    basicAuthEntryPoint.setRealmName("My Realm");
    return basicAuthEntryPoint;
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .exceptionHandling()
            .authenticationEntryPoint(entryPoint())
            .and()
        .authorizeUrls()
            .anyRequest().authenticated()
            .and()
        .httpBasic();       
}

共有1个答案

乜昆
2023-03-14

是的,Spring会有魔力。检查Spring文档:

这就是神奇之处:所有@configuration类都是在启动时用cglib子类化的。在子类中,子方法在调用父方法并创建新实例之前,首先检查容器中是否有任何缓存的(作用域)bean。

这意味着通过CGLIB代理对@bean方法的调用,因此返回缓存的bean版本(不创建新版本)。

请注意,这对于静态方法是无效的。根据spring文档:

对静态@bean方法的调用永远不会被容器拦截,即使在@configuration类中也不会被拦截(如本节前面所述),这是由于技术限制:CGLIB子类化只能重写非静态方法。因此,对另一个@bean方法的直接调用具有标准的Java语义,从而直接从工厂方法本身返回一个独立的实例。

 类似资料:
  • 问题内容: 我很好奇弹簧注入如何处理带有注释的调用方法。如果我在方法上添加注释并返回实例,则我理解这告诉spring通过调用方法并获取返回的实例来创建bean。但是,有时必须使用该bean来连接其他bean或设置其他代码。完成此操作的通常方法是调用带注释的方法以获取实例。我的问题是,为什么这不会导致有多个bean实例漂浮? 例如,请参见下面的代码(取自另一个问题)。该方法带有注释,因此我可以想象s

  • 在Spring Hibernate XML配置中,我有 我知道SpringJava配置的等价物如下:LocalSessionFactoryBuilder(dataSource())。AddAnnotatedClass(Foo.class)。buildSessionFactory(); 我的问题是,如果我不使用LocalSessionFactoryBuilder类,而是使用HibernateJpaV

  • 我知道从中调用带注释的方法,前面已经讨论过了。 但是我不明白为什么当bean被覆盖时它就不起作用了。 我有一个遗留类,我不能修改。它是一个配置,同时也是一个业务bean。这是一个简化版本: 现在,调用返回而不是。 当配置被删除并且测试上下文的配置被设置为时,一切都能正常工作(结果为)。 在测试中注册bean有什么不同?

  • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

  • 我正在学习Spring boot+oauth2+JWT,在AuthorizationServerConfig.class(或其他一些配置类)中,我注意到在许多示例中,它们使用@bean注释修饰一些方法,并将方法设置为'public'。对于ExMaple: 如果我删除Bean注释并使方法私有,我的应用程序仍然可以工作。所以我的问题是,为什么我们需要Bean注释和public方法?

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