Spring:@Component与@Bean

问题

据我所知,在Spring 2.5中引入了@Component注释,以便通过使用类路径扫描来摆脱xml bean的定义。

@Bean是在3.0版本中引入的,可以与@Configuration一起使用,以便完全摆脱xml文件并使用java配置。

是否有可能重新使用@Component注释而不是引入@Bean注释?我的理解是,最终目标是在两种情况下都创建bean。


#1 热门回答(266 赞)

@Component@Bean两个完全不同的东西,不应该混淆。

@Component(and@Serviceand@Repository)用于使用类路径扫描自动检测和自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对布线的控制非常有限,因为它纯粹是声明性的。

@Bean用于明确声明单个bean,而不是让Spring像上面那样自动执行。它将bean的声明与类定义分离,并允许你精确地创建和配置bean。

回答你的问题......

是否可以重用@Component注释而不是引入@Bean注释?

当然可能;但他们选择不这样做,因为两者完全不同。春天已经足够混乱,没有进一步混淆水域。


#2 热门回答(130 赞)

@Component适用于元件扫描和自动接线。

你什么时候应该使用**@Bean**?

有时自动配置不是一种选择.344680146什么时候?**让我们假设你想要连接第三方库中的组件(你没有源代码,因此无法使用@Component注释其类),因此无法进行自动配置。

The**@Beanannotation返回一个对象**,该应该在应用程序上下文中注册为bean。方法**的3117219995主体负责创建实例的逻辑。


#3 热门回答(111 赞)

让我们考虑一下,我希望具体实现取决于一些动态状态.@Bean非常适合这种情况。

@Bean
@Scope("prototype")
public SomeService someService() {
    switch (state) {
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}

但是@Component无法做到这一点。