Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring中@Configuration和@Component的区别是什么?_Spring - Fatal编程技术网

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

Spring中@Configuration和@Component的区别是什么?,spring,Spring,@ComponentScan使用@Configuration和@Component创建bean。交换时,这两个注释都可以正常工作。那有什么区别呢 @配置指示一个类声明一个或多个@Bean 方法和可由Spring容器处理以生成bean 运行时这些bean的定义和服务请求 @Component表示带注释的类是“组件”。这样的 使用时,类被视为自动检测的候选对象 基于注释的配置和类路径扫描 @配置使用@Component进行元注释,因此 @配置类是组件扫描的候选对象 您可以在此处看到更多信息: @C

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

@配置指示一个类声明一个或多个@Bean 方法和可由Spring容器处理以生成bean 运行时这些bean的定义和服务请求

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

@配置使用@Component进行元注释,因此 @配置类是组件扫描的候选对象

您可以在此处看到更多信息:


@Configuration也是一个@Component,但是@Component不能像@Configuration那样工作。

除了reos强调的差异之外

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

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

事实上,答案并不完整,是真的吗:

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


但您确实可以创建MyConfiguration.java类,然后使用
@Component
构造原型,并向其添加
@Beans
声明。这样,它看起来就像一个配置,主要区别在于,当带有
@Configuration
@Bean
的注释类使用CGLIB代理时,注释方法在第一个从上下文返回Bean而不是再次执行方法并创建另一个实例的代码调用后使用CGLIB@Bean

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

示例:

@Configuration
public class ConfigClass {

    @Bean
    public UserClass getObject() {
        return new UserClass();
    }
}
@Component
public class A { .... }

public class B { 
    @Autowired
    A a;
    .....
    .....
}
@Component-如果任何类未标记为@Component,则无法自动连线(@Autowired)。这意味着当您想要使用注释自动关联任何类时,该类应该使用@Component注释

示例:

@Configuration
public class ConfigClass {

    @Bean
    public UserClass getObject() {
        return new UserClass();
    }
}
@Component
public class A { .... }

public class B { 
    @Autowired
    A a;
    .....
    .....
}
供参考的Spring文档:
@组件
默认情况下与
@配置一起导入。控制器、服务和repostory是子组件(以及配置)。它们也是自动检测的候选对象。

,谢谢,但请您解释一下为什么这两个在互换时可以工作。它们不能工作,除非您的配置类没有执行配置类通常会执行的任何操作。正如上面链接的文档中所说,配置是用组件进行元注释的,所以配置就是组件。反之亦然。感谢JB清除我的疑问。欢迎使用指向解决方案的链接,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及为什么存在,然后引用您链接到的页面的最相关部分,以防目标页面不可用。查看链接页面,它只提到了@jcrada在上面的回答中提到的
@Configuration
的备忘录化特性,但没有提到任何关于bean间依赖关系处理的内容。我相信
@Component
中的第二个语句需要澄清,因为它并不完全正确
@Autowire
用springbean实例标记框架要注入的字段/参数。但是,
@Component
只标记要通过组件扫描自动检测的类(顺便说一句,还有各种其他标记注释),这不是一个要求。Bean实例可以通过其他方式创建,比如通过
@Configuration
类、工厂、通过xml配置声明等。根据code@Component满足isConfigurationCandidate以及我的理解,它满足成为一个配置类。在行为上会有所解释的不同吗?