@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();
}
}
浙公网安备 33010602011771号