Spring IoC (ApplicationContext) 容器一般都會在啓動的時候實例化所有單實例 bean 。目的:立即避免和檢測所有可能的錯誤,而不是在運行時。比如發現命名相同的bean…
但是,有些情況下我們需要創建一個bean,而不是在應用程序上下文啓動時,而是在我們請求時創建.那麼這又是篇花裏胡哨的文章了.
@Lazy
@Lazy註釋起源於spring 4.0.x 新特性 參考文章Spring的版本變更
- 核心容器改進
- Spring現在將泛型類型作爲注入Beans時限定符的形式 。例如,如果您正在使用Spring Data Repository,則現在可以輕鬆注入一個特定的實現: @Autowired Repository customerRepository。
- 如果您使用Spring的元註釋支持,現在可以開發自定義註釋來 顯示源註釋中的特定屬性。
- bean現在可以在自動裝配到列表和數組中時進行排序。無論是標註和接口的支持。 @OrderOrdered
- 該@Lazy註釋現在可以在注入點使用,以及對@Bean 定義。
- 該@Description批註已經推出了使用基於Java的配置開發。
- 已經通過註釋添加 了有條件地過濾bean的通用模型@Conditional。這與@Profile支持類似,但允許以編程方式開發用戶定義的策略。
- 基於CGLIB的代理類不再需要默認的構造函數。支持通過提供objenesis 其重新打包庫在線,並將其作爲Spring框架的一部分。有了這個策略,所有的構造函數都不再被調用代理實例。
- 整個框架現在都有管理時區的支持,例如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");
}
}
發現與上面同樣效果的