在Spring框架中,@Configuration注解用于定义配置类,这些配置类可以替代传统的XML配置文件,用于声明bean的定义、组件的扫描等。@Configuration注解中的proxyBeanMethods属性是一个在Spring 5.2及以后版本中引入的重要属性,用于控制配置类中定义的bean方法的调用方式。
proxyBeanMethods=true(默认值)
当proxyBeanMethods设置为true时(这也是Spring 5.2及以后版本的默认值),Spring容器会为每个@Configuration注解的配置类创建一个CGLIB代理。这样做的目的是确保配置类中的bean方法是线程安全的,并且支持方法间的依赖注入。具体来说,当你从同一个配置类中调用另一个@bean方法时,Spring不会直接调用那个方法,而是通过代理来调用,这样可以确保每次调用都返回一个新的bean实例(对于单例bean来说,实际上是返回同一个bean的引用,但由于是通过代理调用的,所以能确保线程安全)。@Bean注解创建的bean默认是单例的,
proxyBeanMethods=false
当proxyBeanMethods设置为false时,Spring容器不会为配置类创建CGLIB代理。这意味着,直接从配置类中调用其他bean方法时,将直接调用那些方法,而不是通过代理。这样做有几个好处:
性能提升:由于没有代理的开销,配置类的处理速度会更快。
减少内存占用:因为不需要为每个配置类创建代理对象,所以可以减少内存的占用。
限制:但是,这也意味着在同一个配置类中直接调用其他bean方法时,将不会触发Spring的依赖注入逻辑。这可能会在某些情况下导致问题,特别是当bean之间存在复杂的依赖关系时。
选择true还是false?
如果你在一个配置类中不经常调用其他bean方法,或者你的应用对性能有较高要求,并且你确信配置类中的bean方法调用不会导致依赖注入问题,那么可以考虑将proxyBeanMethods设置为false。
默认情况下(true),Spring通过代理机制确保了配置类中的bean方法是线程安全的,并且支持方法间的依赖注入,这是更安全和通用的选择。
总之,proxyBeanMethods的设置取决于你的具体需求和对Spring框架的理解。在大多数情况下,保持默认设置(true)是比较稳妥的选择。