@Configration中@Bean注解实例化问题

@Configuration

public class AppConfig {

    @Bean
    public A a() {
        return new A(b());
    }

    @Bean
    public B b() {
        return new B();
    }
} 

上面代码中new A(b());这里面的b()每次调用都是新对象吗?

解析

@Configuration类中,new A(b())中的b()不会每次都返回新对象。Spring通过CGLIB代理确保@Bean方法返回单例实例,具体原因如下:

1. CGLIB 代理机制

  • 代理类:Spring会为@Configuration类生成CGLIB代理,拦截@Bean方法的调用。
  • 单例保证:代理确保多次调用@Bean方法时返回同一个实例。

2. 代码分析

@Configuration
public class AppConfig {

    @Bean
    public A a() {
        return new A(b()); // 这里的 b() 由代理管理,返回单例
    }

    @Bean
    public B b() {
        return new B(); // 单例实例
    }
}
  • b()调用b()通过代理调用,返回同一个B实例。
  • A的创建new A(b())中的b()返回的是单例B

3. 对比 @Component(Lite 模式)

如果去掉@Configuration,改为@Componentb()会直接调用,每次返回新实例:

@Component
public class AppConfig {

    @Bean
    public A a() {
        return new A(b()); // 每次调用 b() 都会创建新实例
    }

    @Bean
    public B b() {
        return new B(); // 每次返回新实例
    }
}
  • 无代理b()直接调用,每次返回新对象。

4. 总结

  • @Configurationb()通过代理调用,返回单例。
  • @Componentb()直接调用,每次返回新实例。

因此,在@Configuration类中,new A(b())中的b()返回的是单例B对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值