@Bean和@Componet区别
无意在两个类上看到了这两个注解,一个使用了@Bean配合@Configuration,一个使用了@Componet。依稀记得这两个注解都是实现以前在xml中<bean xxx/>
的功能,但是具体不知道有什么区别
Google了一下,发现一篇文章写得不错,不过是纯英文的:http://www.tomaszezula.com/2014/02/09/spring-series-part-5-component-vs-bean/
下面是看过上面文章之后自己的一些理解:
首先我们看看这两个注解的作用:
- @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
- @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
两者的目的是一样的,都是注册bean到Spring容器中。
@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
而@Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
举个栗子:
@Controller
//在这里用Component,Controller,Service,Repository都可以起到相同的作用。
@RequestMapping(″/web/controller1″)
public class WebController {
.....
}
而@Bean的用途则更加灵活
当我们引用第三方库中的类需要装配到Spring容器时,则只能通过@Bean来实现
举个例子:
public class WireThirdLibClass {
@Bean
public ThirdLibClass getThirdLibClass() {
return new ThirdLibClass();
}
}
再举个只能用@Bean的例子:
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
以上这个例子是无法用Component以及其具体实现注解(Controller、Service、Repository)来实现的。
@Bean 和 @Component的区别
前言
最近研究Springboot 源码的时候发现这两个注解比较常出现,但是放眼看去这两个注解好像功能都差不多,所以专门研究了一下:
注解作用
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
两者对比
相同点:
- 两者的结果都是为spring容器注册Bean.
不同点:
- @Component 通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中
- @Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
理解
@Component (@Controller @Service @Respository)作用于类上,只有在我们的SpringBoot应用程序启用了组件扫描并且包含了被注解的类时才有效。通过组件扫描,Spring将扫描整个类路径,并将所有@Component注释类添加到Spring Context,这里有的不足就是会把整个类当成bean注册到spring 容器上,如果这个类中并不是所有方法都需要注册为bean的话,会出现不需要的方法都注册成为bean,这时候必须确保这些不需要的方法也能注册为bean或者在扫描中加filter 过滤这些不需要的bean,否者spring将无法成功启动。
@Bean相对来说就更加灵活了,它可以独立加在方法上,按需注册到spring容器,而且如果你要用到第三方类库里面某个方法的时候,你就只能用@Bean把这个方法注册到spring容器,因为用@Component你需要配置组件扫描到这个第三方类路径而且还要在别人源代码加上这个注解,很明显是不现实的。
总结
@Component和@Bean都是用来注册Bean并装配到Spring容器中,但是Bean比Component的自定义性更强,可以实现一些Component实现不了的自定义加载类。
问题
@Component和@Bean做两个完全不同的事情,不应该混为一谈。
@Component(和@Service和@Repository)用于自动检测和使用类路径扫描自动配置豆。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对布线的控制非常有限,因为它纯粹是声明性的。
@Bean用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您根据自己的选择创建和配置bean。
回答你的问题
是否可以重复使用@Component注释而不是引入@Bean注释?
当然可能; 但他们选择不这样做,因为两者完全不同。春天已经足够混乱,没有进一步混淆水域。
@Component优先 用于元件扫描和自动布线。
什么时候应该使用@Bean?
有时自动配置不是一种选择。什么时候?让我们假设您想要连接来自第三方库的组件(您没有源代码,因此您无法使用@Component注释其类),因此无法进行自动配置。
所述@Bean注释返回一个对象该对象应在应用程序上下文中注册。方法的主体承担负责创建实例的逻辑。如果考虑一下我需要具体的实现取决于一些动态状态。 @Bean对于这种情况是完美的,然而,没有办法做到这一点@Component。
@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();
}}