共同点:
都可以声明一个bean注入到ioc 容器中。
区别
@Configuration
可以将内部 通过@Bean 生成的bean 注入同一类的其他bean,如下代码:
/测试其他配置bean加载情况
@Bean("otherBean")
@Order(1)
public MyBean otherBean(){
System.out.print('init');
return new MyBean();
}
//测试注入当前类其他bean
@Bean("testInjectOtherBean")
@Order(2)
public MyBean testInjectOtherBean(){
//otherBean已经通过 @Order(1)来声明优先实例化
// 这里调用otherBean时,会直接从IOC池返回,而不会再执行一次操作。
//实现过程应该是spring 已经做了一层代理
MyBean otherBean = otherBean();
MyBean myBean = new MyBean();
return myBean;
}
@Configuration 标记的类必须符合下面的要求:
- 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
- 配置类不能是 final 类(没法动态代理)。
- 配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
- 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
- 任何嵌套配置类都必须声明为static。
- @Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。
@Component
没有通过 cglib 来代理@Bean
方法的调用,每次调用后产生不同的对象