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

Hus*_*din 2 spring spring-boot spring-boot-configuration spring-autoconfiguration

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

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

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

Phi*_*ebb 5

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

假设您有这样的配置:

@Configuration(proxyBeanMethods=true)
class MyConfiguration {

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

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

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Spring 必须动态创建 CGLIB 子类,MyConfiguration以确保任何对myBean2()实际委托的调用BeanFactory

这意味着在应用程序启动时需要生成并加载额外的字节码。

如果重写配置如下:

@Configuration(proxyBeanMethods=false)
class MyConfiguration {

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

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

}
Run Code Online (Sandbox Code Playgroud)

不仅节省了资源,而且代码更诚实地说明了它实际在做什么。

如果你真的很想继续使用代理类你可以继续使用@Configuration。从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的条目加载的类实际上不需要用@AutoConfiguration.