我使用@Lookup注释实现了一个Spring bean。 (这个帖子很有帮助:How to use spring @Lookup annotation?)
我后来注意到一种奇怪的行为,我不确定是出于设计还是我自己的误解。 Spring将在使用@ Service,@ Component等注释的ComponentScan-ed bean中实现@Lookup方法,但不会在@Configuration类(Application.java)中定义的@Bean中实现这样的方法。
这不是一个大问题,因为我可以从配置中删除@Bean定义,而是直接注释它的类;但我想知道这种行为是否记录在某处,或者我是否错误地实施了它?
@Bean
public Service getService() {
// ServiceImpl has a @Lookup method,
// but Spring does not implement it unless the class itself is annotated.
return new ServiceImpl();
}
答案 0 :(得分:2)
由于您自己调用new
,因此Spring不会创建该实例,因此不会处理任何Spring注释(包括@Lookup
)。正如您已经注意到的那样,通过使类成为@Component
,一切都按预期工作,因为当您将@Autowire
转换为另一个类时,Spring会将其实例化。
在你的例子中,你仍然可以@Autowire
你创造的豆子,但是你要告诉Spring"嘿,使用这个我自己作为豆子的东西"而不是让Spring自己实例化它。
@Lookup
没有具体记录,因为它只是Spring IoC容器工作方式的一部分。只要您自己使用new
,就可以随时使用。
答案 1 :(得分:0)
实际上,此行为 是@Lookup
批注的限制。 Spring documentation的最新版本比4.1版本更清楚地描述了警告。
...请记住,在配置类中,从
@Bean
方法返回的bean不能使用查找方法;
通常,从@Bean
方法 do 返回的对象要处理其注释。 @Lookup
是典型行为的例外。