带@Lookup方法的Spring @Bean

时间:2015-03-24 18:14:26

标签: java spring annotations spring-annotations

我使用@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();
}

2 个答案:

答案 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是典型行为的例外。