相同点:
不同点:
@Bean 注解的方法都会被CGlib动态代理,因此调用该方法返回的都是同一个实例- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Component
- public @interface Configuration {
- @AliasFor(
- annotation = Component.class
- )
- String value() default "";
-
- boolean proxyBeanMethods() default true;
- }
@Configuration注解
2. @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。
因为源码是直接调用CGlib动态代理的代理类,obtainBeanInstanceFromFactory 方法比较简单,就是通过 beanFactory.getBean 获取 Country,如果已经创建了就会直接返回,如果没有执行过,就会通过 invokeSuper 首次执行。
具体底层的实现原理可以去看一看这篇文章:configuration和component区别底层实现
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。