@Configuration和@Component的区别

【一句话】@Configuration和@Component的区别

首先一句话:

@Configuration修饰的类会被Cglib动态代理,@Component不会。

详细:

Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。

实际是因为

注解下有个proxyBeanMethods属性,默认值为true,如果手动设为false,直接调用@Bean方法和@Autowired拿到的就不是同一个对象了,当然,你直接调用@Bean方法跟直接调用其他方法也没有区别了,相当于你直接调用的时候,没有被代理类执行,本来执行什么,现在执行什么。比如:B类下有个c对象是@Autowired的,如果把proxyBeanMethods设为false,直接调用@Bean方法生成的B类对象,c成员变量为null。

另外,如果你想搜索这个属性在哪里使用的话,去搜字符串,因为它的源码是这样的:

 

 入口类:

org.springframework.context.annotation.ConfigurationClassUtils

即使用@Configuration时

  @Autowired自动注入的对象和直接调用@Bean修饰的方法及多次调用@Bean修饰的方法拿到的是同一个对象。

当然,多个@Autowired自动注入的对象不管使用哪个注解拿到的都是同一个对象哈,因为默认是单例的嘛

看个例子就好理解了:

@Configuration
// @Component
public class Test {

    @Bean
    public A a(){
        A a = new A();
        a.setB1(b());
a.setB2(b()); return a; } @Bean public B b(){ B b = new B (); return b; } }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » @Configuration和@Component的区别