调用bean方法与注入bean实例

时间:2019-04-25 21:41:06

标签: java spring

编辑

看来我11:40 PM的搜索技能还没有达到标准,标记为重复的确实是同一问题。答案就是我的问题的答案。


this问题和相关的答案中,给出以下信息:

  

Spring为您的@Configuration注释类创建一个代理。该代理拦截@Bean方法调用并缓存Bean实例,以便对同一@Bean方法的进一步调用引用同一Bean实例。

     

因此,在这种情况下,两个对bar()方法的调用都指向同一个Bar实例.Bar实例实际上是每个应用程序上下文一个单例。这就是@Bean方法可见性仅限于protected,package或public的原因,因为Spring需要在代理中覆盖您的@Bean方法。

但是,我认为这种解释与我目前对默认Spring Proxying的理解不一致。

默认情况下,对@Bean或类似注解的候选对象(@Service@Controller等)所有 调用都必须通过外部调用进行Spring会通过注入的代理对象自动拦截,以利用Spring代理功能。

此外,默认情况下,除非完成了一些附加设置(例如,使用 @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)和自动连接的存根,该存根已替换为对代理本身的引用,然后必须使用它代替this或使用CTW)。

请记住,我的理解是以下代码:

@Configuration
public SomeConfiguration {

    @Bean
    public someBean() {
        return new SomeBean();
    }

    @Bean
    public anotherBean() {
        return new AnotherBean(someBean());
    }
}

@Configuration
public SomeConfiguration {

    @Bean
    public someBean() {
        return new SomeBean();
    }

    @Bean
    public anotherBean(SomeBean someBean) {
        return new AnotherBean(someBean);
    }
}

应该表现出不同的表现,例如(根据我的理解):

  • 在第一个示例中,someBean被容器实例化了一次,并且在anotherBean构造函数调用之前被一次了,从而产生了一个单独的实例,生活在应用程序上下文之外。

  • 在第二个示例中,anotherBean隐式依赖于someBean,因此一旦在上下文中注册了someBean就会被调用,并将已知的单例实例传递给它。

由于这些问题,到目前为止,我一直都使用第二种方法,但是官方文档中甚至为@Scheduled注释(here,{{ 1}})。我想念什么吗?

0 个答案:

没有答案