Spring bean延迟初始化

gal*_*ics 7 java spring spring-aop spring-bean

我在考虑Spring中的bean的延迟初始化.对我来说,这里的"懒惰"意味着在引用bean时会创建一个bean,这一点并不十分清楚.

我期望Spring中的延迟初始化支持是不同的.我认为这是一个基于"方法调用"的懒惰创作.我的意思是,无论何时在方法上调用任何方法,都会创建它.

我认为这可以通过创建特定bean的代理实例并在任何方法调用上进行初始化来轻松解决.

我错过了为什么没有实现的东西?这个概念有什么问题吗?

任何反馈/想法/答案将不胜感激.

多谢你们!

Sav*_*ior 5

您可以通过使用proxyModeof ScopedProxyMode.TARGET_CLASS(CGLIB) 或ScopedProxyMode.INTERFACES(JDK)来限定 bean 的范围来实现您想要的行为。

例如

public class StackOverflow {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Conf.class);
        Bar bar = ctx.getBean(Bar.class);
        System.out.println(bar);
        System.out.println(bar.foo.toString());
    }
}

@Configuration
class Conf {
    @Bean
    @Lazy
    @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Foo foo() {
        System.out.println("heyy");
        return new Foo();
    }

    @Bean
    public Bar bar() {
        return new Bar();
    }
}

class Bar {
    @Autowired
    public Foo foo;
}

class Foo {
}
Run Code Online (Sandbox Code Playgroud)

将打印

com.example.Bar@3a52dba3
heyy
com.example.Foo@7bedc48a
Run Code Online (Sandbox Code Playgroud)

证明只有在Foobean 中的 Spring 上下文注入@BeanFoo实例上调用方法之后,bean 才通过其工厂方法进行初始化Bar

@Scope批注可以在类声明中使用。