使用Spring @Lazy和@PostConstruct注释

roh*_*wal 2 java spring annotations lazy-evaluation postconstruct

我有以下课程:

@Repository
class A {

    public void method1() {
        ...
    }
}

@Component
class B implements C {

    @Autowired
    @Lazy
    private A a;

    public void method2() {
        a.method1();
    }
}

@Component
class D {

    @Autowired
    private List<C> c;

    @PostConstruct
    public void method3() {
        // iterate on list c and call method2()
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们假设Spring将bean初始化如下:
1.创建第一个bean B. 当创建bean B时,a由于@Lazy注释,将不会初始化字段.
2.创建下一个bean D. 然后method3()将被标记为执行@PostConstruct,但Spring尚未触及bean A. 因此,当调用a.method1()时,Spring会创建bean A并将其注入字段中a还是会抛出NullPointerException

Ken*_*kov 6

您需要了解,当您指定@Lazy注入的一部分时会发生什么.根据文件:

除了它对组件初始化的作用外,@Lazy 注释还可以放在标有 @Autowired或的@Inject 注入点上.在这种情况下,它会导致注入惰性解析代理.

这意味着在启动时Spring将注入代理类的实例而不是类的实例A.Proxy类是自动生成的类,具有与class相同的接口A.在第一次调用任何方法时,代理将A在self中创建类的实例.之后,所有方法调用都将重定向到A代理内部的此类实例.

所以没有理由害怕任何问题.