花裏胡哨的@Lazy註解

在這裏插入圖片描述

Spring IoC (ApplicationContext) 容器一般都會在啓動的時候實例化所有單實例 bean 。目的:立即避免和檢測所有可能的錯誤,而不是在運行時。比如發現命名相同的bean…
但是,有些情況下我們需要創建一個bean,而不是在應用程序上下文啓動時,而是在我們請求時創建.那麼這又是篇花裏胡哨的文章了.

@Lazy

@Lazy註釋起源於spring 4.0.x 新特性 參考文章Spring的版本變更

  • 核心容器改進
  1. Spring現在將泛型類型作爲注入Beans時限定符的形式 。例如,如果您正在使用Spring Data Repository,則現在可以輕鬆注入一個特定的實現: @Autowired Repository customerRepository。
  2. 如果您使用Spring的元註釋支持,現在可以開發自定義註釋來 顯示源註釋中的特定屬性。
  3. bean現在可以在自動裝配到列表和數組中時進行排序。無論是標註和接口的支持。 @OrderOrdered
  4. 該@Lazy註釋現在可以在注入點使用,以及對@Bean 定義。
  5. 該@Description批註已經推出了使用基於Java的配置開發。
  6. 已經通過註釋添加 了有條件地過濾bean的通用模型@Conditional。這與@Profile支持類似,但允許以編程方式開發用戶定義的策略。
  7. 基於CGLIB的代理類不再需要默認的構造函數。支持通過提供objenesis 其重新打包庫在線,並將其作爲Spring框架的一部分。有了這個策略,所有的構造函數都不再被調用代理實例。
  8. 整個框架現在都有管理時區的支持,例如LocaleContext。

使用Configuration方式

創建Configuration配置類,並加入@Lazy

@Lazy
@Configuration
public class LazyConfig {
    @Bean
    public TLazy getTLazy(){
        return new TLazy();
    }
}
  • 創建bean-TLazy
public class TLazy {
    @PostConstruct
    public void init(){
        System.out.println("------------懶加中---------");
    }
    public void say(){
        System.out.println("hello!! 我更帥!!!");
    }
}
  • 用@PostConstruct註解,在bean創建時會打印出
------------懶加中---------
  • 創建test
@SpringBootTest
@RunWith(SpringRunner.class)
public class testControllerTest {

    @Lazy
    @Autowired
    private TLazy tLazy;

    @Test
    public void hello() {
      //  tLazy.say();
        System.out.println("hello");
    }
}
  • 運行,發現控制檯只打印出hello
hello
  • 放開tLazy.say(); 發現控制檯打印出
------------TLazy懶加中---------
hello!! 我更帥!!!
hello

@Autowired模式

  • 創建TAutoLazy
@Lazy
@Component
public class TAutoLazy {
    @PostConstruct
    public void init(){
        System.out.println("------------TAutoLazy懶加中---------");
    }
    public void say(){
        System.out.println("TAutoLazy!! 我更帥!!!");
    }
}
  • testControllerTest
@SpringBootTest
@RunWith(SpringRunner.class)
public class testControllerTest {
    @Lazy
    @Autowired
    private TAutoLazy tAutoLazy;
    
    @Test
    public void hello() {
 //       tAutoLazy.say();
        System.out.println("hello");
    }
}

發現與上面同樣效果的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章