spring 为什么@AutoConfiguration使用proxyBeanMethods = false,@AutoConfigureBefore,@AutoConfigureAfter

svmlkihl  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(104)

Sping Boot 自动配置最近在版本2.7中进行了更改,并且大多数设置在版本3.0中被弃用(您可以在此处找到详细信息)。此外,他们还为自动配置类引入了新的注解,即@AutoConfiguration。我无法理解注解的默认设置,如下所述:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore
@AutoConfigureAfter
public @interface AutoConfiguration {
}

为什么他们强制用户继承proxyBeanMethods = false@AutoConfigureBefore@AutoConfigureAfter

8nuwlpux

8nuwlpux1#

我们默认为proxyBeanMethods=false的原因是因为我们认为这是自动配置类的最合理的默认值。这意味着在启动应用程序时需要更少的处理时间。
假设你有一个这样的配置:

@Configuration(proxyBeanMethods=true)
class MyConfiguration {

    @Bean
    MyBean1 myBean1() {
        return new MyBean1(myBean2());
    }

    @Bean
    MyBean2 myBean2() {
        return new MyBean2();
    }

}

在这种情况下,Spring必须动态创建MyConfiguration的CGLIB子类,以确保对myBean2()的任何调用实际上都委托给BeanFactory
这意味着在应用程序启动时需要生成和加载额外的字节码。
如果按如下方式重写配置:

@Configuration(proxyBeanMethods=false)
class MyConfiguration {

    @Bean
    MyBean1 myBean1(MyBean2 myBean2) {
        return new MyBean1(myBean2);
    }

    @Bean
    MyBean2 myBean2() {
        return new MyBean2();
    }

}

这样不仅保存了资源,而且代码对它实际在做什么更加诚实。
如果你真的想继续使用代理类,你可以继续使用@Configuration。从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的条目加载的类实际上不需要使用@AutoConfiguration进行注解。

相关问题