@Component在春天有什么用?

时间:2014-10-07 06:12:02

标签: dependency-injection guice autowired spring-ioc

Guice没有类似的概念。例如,Guice可以使用默认构造函数自动注入任何类,而无需任何特殊的类注释。为什么spring必须知道启动时的每个bean? 出于自动装配的目的,cant spring只是从类路径中查找类?我能想到的一个原因是AOP。但是如果你不使用AOP,整个bean定义计算会增加大量的启动时间,这是完全没必要的。

编辑:

显然,我希望spring能够根据需要从类路径

中查找一个类
@Component
class Bar {

}

@Component
class Foo {
    @Autowired Bar bar;
    public void doSomething() {}
}

所以当我使用Foo spring创建bean getBean()时,可以看到它需要一个Bar,因此它可以简单地在类路径上查找Bar。这就是Guice所做的,它避免了在开发过程中非常慢的不必要的组件扫描。

1 个答案:

答案 0 :(得分:1)

@Component@Repository@Controller@Service注释定义了可由Spring IoC容器“组件扫描”的各种bean。您可以在定义Spring上下文时指定扫描哪个包。

您可以显式使用类来创建注册Spring bean。在这种情况下,您不需要使用注释。

AFAIK没有使用注释就没有自动扫描bean。我个人喜欢这样一个事实:从类中看它是由IoC容器驱动的(当你使用组件扫描时)。希望没有注释的扫描思想永远不会渗透到Spring中。

修改

是的,但是你需要将这个类注册为bean。 Java Config示例:

@Configuration
public class SpringConfig{

    @Bean
    public Bar createBarBean(){
        new Bar();
    }
}

但我相信这对你来说并不方便,因为你不想明确注册每个bean。那太过分了。

以下是Spring文档的一些相关部分:

我不知道任何其他bean查找机制。