@Configuration 注解 proxyBeanMethods 属性

@Configuration(proxyBeanMethods = false)的作用是禁用基于 CGLIB 的代理机制,通过牺牲部分 Spring 容器的特性来换取性能优化。以下是具体作用和场景分析:


一、默认行为(proxyBeanMethods = true

代理机制

proxyBeanMethods 默认为 true,此时 Spring 会为@Configuration类生成 CGLIB 代理,确保通过@Bean方法获取的 Bean 是单例。

示例:方法间调用会被代理拦截,返回容器中已存在的 Bean。

@Configuration
public class AppConfig {
    @Bean
    public A a() { return new A(); }
    
    @Bean
    public B b() {
        a(); // 通过代理调用,返回单例 Bean
        return new B();
    }
}

代价

  • 增加启动时间(需生成代理类)
  • 占用更多内存(代理类开销)

二、proxyBeanMethods = false的作用

关闭代理

配置类变为普通类,@Bean方法间的调用不再通过代理,直接执行方法体。

示例:方法间调用会创建新对象(破坏单例)。

@Configuration(proxyBeanMethods = false)
public class AppConfig {
    @Bean
    public A a() { return new A(); }
    
    @Bean
    public B b() {
        a(); // 直接调用,返回新实例
        return new B();
    }
}

性能优化

  • 启动速度提升:减少代理生成时间(适合大型项目)
  • 内存占用降低:消除代理类的开销
  • 反射优化:Spring 5.2+ 对非代理配置类有额外优化

三、适用场景

场景 建议值 原因
配置类中的@Bean方法相互调用 true(默认) 确保单例
配置类独立声明 Bean(无方法间调用) false 性能优化
Spring Boot 自动配置类 false(常见) 优化启动速度

四、注意事项

单例失效风险

如果@Bean方法间存在调用且proxyBeanMethods = false,会导致多例问题。

版本兼容

Spring Framework 5.2+ 和 Spring Boot 2.2+ 支持此属性。


五、代码对比示例

// 默认行为(proxyBeanMethods = true)
@Configuration
public class ProxyConfig {
    @Bean
    public Service service() {
        return new Service(repository()); // 代理拦截,返回单例
    }
    
    @Bean
    public Repository repository() {
        return new Repository();
    }
}

// 禁用代理(proxyBeanMethods = false)
@Configuration(proxyBeanMethods = false)
public class LiteConfig {
    @Bean
    public Service service() {
        return new Service(repository()); // 直接调用,每次创建新实例
    }
    
    @Bean
    public Repository repository() {
        return new Repository();
    }
}
posted @ 2025-05-26 00:01  Higurashi-kagome  阅读(200)  评论(0)    收藏  举报