簡體   English   中英

使用Spring @Lazy和@PostConstruct批注

[英]Using Spring @Lazy and @PostConstruct annotations

我有以下課程:

@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()
    }
}

讓我們假設Spring如下初始化bean:
1.創建第一個beanB。 創建bean B時,由於@Lazy批注,字段a將不會初始化。
2.創建下一個beanD。 然后method3()將被執行,因為它已被@PostConstruct標記,但是Spring尚未觸及method3() 因此,當將調用a.method1()時,Spring將創建bean A並將其注入到字段a還是拋出NullPointerException

您需要了解,在指定@Lazy作為注入的一部分時發生了什么。 根據文件

除了用於組件初始化的作用外, @Lazy 批注還可以放置在標有 @Autowired@Inject 注入點上 在這種情況下,它導致注入了 惰性解析代理。

這意味着在啟動時,Spring將注入代理類的實例而不是A類的實例。 代理類是自動生成的類,具有與A類相同的接口。 第一次調用任何方法時,代理將在自身內部創建類A實例。 之后,所有方法調用將重定向到代理內部的A類實例。

因此,沒有理由擔心任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM