【问题标题】:What's the use of @Component in spring?spring 中@Component 有什么用?
【发布时间】:2014-10-07 06:12:01
【问题描述】:

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

编辑:

明确地说,我希望 spring 从类路径中按需查找一个类

@Component
class Bar {

}

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

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

【问题讨论】:

    标签: dependency-injection guice autowired spring-ioc


    【解决方案1】:

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

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

    AFAIK 在不使用注释的情况下不会自动扫描 bean。我个人喜欢这样一个事实,即从类中可以明显看出它是由 IoC 容器驱动的(当您使用组件扫描时)。希望这种无注解扫描的想法永远不会渗透到 Spring 中。

    编辑

    可以,但是您需要将此类注册为 bean。 Java 配置示例:

    @Configuration
    public class SpringConfig{
    
        @Bean
        public Bar createBarBean(){
            new Bar();
        }
    }
    

    但我相信这对您来说并不方便,因为您不想显式注册每个 bean。那太矫枉过正了。

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

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

    【讨论】:

    • 谢谢,这回答了我的问题,但我想要更多:当需要一个类自动装配到另一个类时,spring 可以简单地按需在类路径上查找一个类吗?那将消除组件扫描。我已将我的问题编辑得更具体。
    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多