Spring中的 @Configuration 和 @Component 有什么区别?

fivyi3re  于 2022-11-21  发布在  Spring
关注(0)|答案(7)|浏览(154)

@ComponentScan使用@Configuration@Component创建bean。这两个注解在交换时都能正常工作。那么有什么区别呢?

0s0u357o

0s0u357o1#

@Configuration 指示类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求
@Component表示带注解的类是“组件”。在使用基于注解的配置和类路径扫描时,此类类被视为自动检测的候选类。
@Configuration是使用@Component进行元注解的,因此@Configuration类是组件扫描的候选对象
您可以在此处查看更多信息:
http://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html
@Configuration 也是 @Component ,但 @Component 不能像 @Configuration 那样工作。

r7knjye2

r7knjye22#

其实答案并不完整,是不是真的:
@Component表示带注解的类是“组件”。在使用基于注解的配置和类路径扫描时,此类类被视为自动检测的候选类。
但是你可以创建例如MyConfiguration.java类,然后用@Component构造型,并添加@Beans声明到其中。这样它看起来就像一个配置,主要区别在于,当带有@Configuration@Bean注解类使用 CGLIB 代理时,在第一次调用之后,在代码中进行调用以从上下文返回bean,而不是像使用@Component和@Bean时那样再次执行方法并创建另一个示例

zujrkrfu

zujrkrfu3#

它们之间有一个非常微妙的区别。让我对此提供一个非常快速的展望。
请考虑以下情况:

@Configuration
public class MyConfig {

    @Bean
    public ServiceA aService(){
        return new ServiceA();
    }

    @Bean
    public ServiceB bService(){
        return new ServiceB(aService());
    }

}

请注意,ServiceB bean依赖于ServiceA这不是自动连接的。相反,它的编写方式意味着创建了一个新的示例,而实际上不是由Spring创建的。您,作为程序员,使用了new关键字。
因此,如果我们使用@Configuration,那么它使用CGLIB代理,在这种情况下,它创建一个由Spring上下文管理的单例bean。如果你多次调用它,它返回由Spring创建的同一个bean--类似于自动装配效果。
然而,如果您使用@Component,它将不会执行此代理,并且在每次调用方法时只会返回一个新示例,而不是提供Spring托管示例。(请记住,Spring bean是由Spring容器管理的东西,作为开发人员,您的工作是将它们拉入,例如使用@Autowired
同样的@Component效果也可以通过@Configuration(proxyEnabled= false)来实现(这也被称为bean light模式处理)。因此,在light模式下,您最终会执行以下操作:

@Configuration(proxyEnabled = false) // Lite mode, same effect as @Component
public class MyConfig {

    @Bean
    public ServiceA aService() {
        return new ServiceA();
    }
    
    @Autowired
    @Bean
    public ServiceB bService(ServiceA aServiceBean){
        return new ServiceB(aServiceBean);
    }

}

Refer here for a more elaborate explanation
希望能有所帮助!编码快乐!

ckx4rj1h

ckx4rj1h4#

@Configuration-它类似于beans.xml,但它是基于Java的Bean配置。这意味着使用此注解进行注解的类是配置Bean的位置,并且将成为自动检测的候选对象。在此类中,方法使用@Bean进行注解,它将返回该类的对象。
范例:

@Configuration
public class ConfigClass {

    @Bean
    public UserClass getObject() {
        return new UserClass();
    }
}

@Component-如果类未标记@Component,则无法自动连接(@Autowired)任何类。这意味着当您要使用注解自动连接任何类时,该类应使用@Component进行注解。
范例:

@Component
public class A { .... }

public class B { 
    @Autowired
    A a;
    .....
    .....
}

参考的Spring文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

p8h8hvxi

p8h8hvxi5#

默认情况下,@Component@Configuration一起导入。控制器、服务和资料档案库是子组件(与配置沿着)。它们也是自动检测的候选组件。

4sup72z8

4sup72z86#

我在@雷乌斯的答案上延伸。
1.@Configuration指示类声明一个或多个@Bean方法,并且可以由Spring容器处理,以在运行时为这些Bean生成Bean定义和服务请求。
1.如果查看@Configuration类,您将看到它是用@Component进行元注解的。

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Configuration
  1. @Bean使我们能够以任何我们喜欢的方式定义依赖关系,这就是为什么@Bean注解位于方法之上,我们手动创建一个bean对象并从该方法返回它。@Component使我们能够快速定义依赖关系,这就是为什么@Component位于类之上。我们只在需要的地方注入它。
    总的来说,这三点说明了-为了快速定义一个bean,我们可以用@Component来注解类。为了定义我们喜欢的bean(支持自定义需求),我们可以在一个@Configuration注解的类中使用@Bean来编写bean定义。
dgsult0t

dgsult0t7#

除了reos强调的差异。
@Configuration不能被@Component替换的原因如下:
不同之处在于如何处理bean间的依赖关系。有关示例的详细说明,请参考以下链接:Difference between Configuration and Component

相关问题