@Lazy 的屬性
Spring IoC (ApplicationContext) 容器一般都會在啓動的時候實例化所有單實例 bean 。如果我們想要
Spring 在啓動的時候延遲加載 bean,即在調用某個 bean 的時候再去初始化,那麼就可以使用 @Lazy 註解。
value 取值有 true 和 false 兩個 默認值爲 true
true 表示使用 延遲加載, false 表示不使用,false 純屬多餘,如果不使用,不標註該註解就可以了。
Person 類
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
System.out.println(" 對象被創建了.............");
this.name = name;
this.age = age;
}
// 省略 getter setter 和 toString 方法
}
配置類 不標註 @Lazy 註解
public class LazyConfig {
@Bean
public Person person() {
return new Person("李四", 55);
}
}
測試
@Test
public void test5() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(LazyConfig.class);
}
不獲取 bean , 看控制檯是否會打印。如果有打印,代表調用了構造器。
結果
在配置類打上 @Lazy 註解
public class LazyConfig {
@Lazy
@Bean
public Person person() {
return new Person("李四", 55);
}
}
再來看輸出結果
沒有打印語句,對象沒有調用構造器,那麼方法也就沒有被創建。
@Lazy(value = false) 或者 @Lazy(false) 那麼對象會在初始化的時候被創建
@Lazy註解註解的作用主要是減少springIOC容器啓動的加載時間
當出現循環依賴時,也可以添加@Lazy
阻塞隊列被異步消費怎麼保持順序呢?
堵塞隊列是一個符號FIFO的隊列,使用condition條件維護了兩個等待隊列,如下圖
任務隊列滿了,生產者會被按照先進先出的順序放在鏈表裏面,消費者也是如此。
對於堵塞隊列的消費過程有兩種情況,第一種是堵塞隊列裏面已經包含了很多任務,這個時候啓動消費者線程去消費的時候,
他的有序性是通過加鎖來實現的,每個消費者線程去堵塞隊列裏面獲取任務的時候,必須先要去獲得排它鎖,如果多個消費者如果堵塞
隊列裏面沒有任務而堵塞這個時候線程是按照FIFO的一個順序存儲到一個condition條件等待隊列裏面,按照FIFO的順序被喚醒。
停止線程
使用stop會產生的問題