编辑:
看来我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}})。我想念什么吗?