相同点
注解@Component(@Repostory,@Service,@Controller同@Component效果一样,下文不再赘述)和@Bean一样会生成一个对象来被IOC容器管理,并且这两个注解都能为管理的bean指定name等属性。
不同点
- @Component注解使用在类上。只适用于生成自己定义的类的对象;@Bean注解使用在方法上,所在类必须被@Configuration或@Component注解。可以生成自己定义的类或者其他工具包的对象。
- @Component注解一般使用类的无参构造方法来生成对象给IOC容器管理。逻辑简单,但是不灵活,适用于业务逻辑简单的对象管理;@Bean注解使用注解方法的返回对象给IOC容器管理。需要自己定义该对象的生成逻辑,相对比较复杂,但是可以解决一些较为复杂的逻辑。
使用场景
上文给出了两种注解的相同点于不同点,但光看文字可能不是这么好理解,下面给出具体样例加以说明。
例1
@Controller(“myController”)
//@Componet 作用与@Controller相同
public class MyController() {
//my Controller
}
控制器这种bean生成逻辑简单,并且构造器不需要入参,使用Component注解简单方便。此案例也可以使用@Bean来实现,见下图,代码行数多,而且还多一个方法,复杂度比Component要高很多。
@Configuration
//通常此注解被使用在配置相关的类中,不在本文的讨论范围,贪图方便将此注解用于此处。
//实际开发中请勿学习此做法。
public class MyController() {
@Bean(name = "myController")
public MyController genMyController() {
return new MyController();
}
// my controller
}
例2
@Configuration
//通常此注解被使用在配置相关的类中,不在本文的讨论范围,贪图方便将此注解用于此处。
//实际开发中请勿学习此做法。
public class SpringBean {
private String id;
@Bean
public String genId(){
return "aaa";
}
@Bean(name = "mySpringBean")
public SpringBean genString(String id){//参数值从IOC容器中取
if (null != id && !id.isEmpty()) {
return new SpringBean(id);
} else {
return null;
}
}
public SpringBean(String id) {
super();
this.id = id;
}
}
这段代码中这个类根据容器中的String参数来生成目标对象或者不生成实例对象,只能使用@Bean注解来完成。