Skip to content

@Component 和 @Bean 的区别

  • 注解位置不同

@Component 注解在类上,@Bean 注解在方法上。

  • 实例化方式不同

@Component 是通过扫描@ComponentScan注解设置的类路径来自动检测及自动装配到Spring Ioc容器中,@Bean标注的是方法,表明这个方式产生一个类实例,使用方法名为bean的名称并设置到ioc容器中。

  • 自定义能力不同

@Bean是注解到方法上,需要在方法内部手动实例化对象,有更多的自定义能力,同时对于第三方库中的类,无法标注@Component注解,因此只能通过@Bean的方式。

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

	String value() default "";

}
java
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

	@AliasFor("name")
	String[] value() default {};

	@AliasFor("value")
	String[] name() default {};

	@Deprecated
	Autowire autowire() default Autowire.NO;

	boolean autowireCandidate() default true;

	String initMethod() default "";

	String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}