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

时间:2016-08-26 21:10:59

标签: spring

@ComponentScan使用@Configuration和@Component创建Beans。交换时这两个注释都可以正常工作。那有什么区别呢?

5 个答案:

答案 0 :(得分:18)

  

@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不能像@Cofinguration那样。

答案 1 :(得分:8)

实际上答案还不完整,是吗:

  

@Component表示带注释的类是“组件”。这样   在使用时,类被视为自动检测的候选者   基于注释的配置和类路径扫描。

但是你可以使用@Component创建,即MyConfiguration.java类,然后使用@Beans添加@Configuration声明。通过这种方式,它看起来像一个配置,主要区别在于带有@Bean {{1}}注释方法的带注释的类是使用 CGLIB 的代理,它在第一个之后的代码调用中生成从上下文返回bean而不是再次执行方法,并在将@Component与@Bean

一起使用时创建另一个实例

答案 2 :(得分:0)

@Configuration -类似于bean.xml,但基于Java的bean配置。这意味着用该注释注释的类是配置bean的地方,它将成为自动检测的候选对象。在此类中,方法使用@Bean注释,该方法返回该类的对象。

示例:

@Configuration
public class ConfigClass {

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

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

示例:

@Component
public class A {  .... }

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

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

答案 3 :(得分:0)

user_ans默认情况下与@Component一起导入。控制器,服务和重新发布是子组件(以及配置)。它们也是自动检测的候选对象。

答案 4 :(得分:-4)

除了reos突出显示的差异。

@Component不能被@Component替换的原因如下:

区别在于如何处理bean间依赖关系。 有关示例的详细说明,请参阅链接: Difference between Configuration and Component