AutoWired注解和Lazy延遲加載


一.代碼截圖:

 

 

 

@Lazy是延遲加載的意思, 容器啟動時不創建對象, 當從容器中需要獲取此對象時才創建.

@Lazy//@Lazy注解可以用在類上, 還可以用在普通方法上,還可以用在構造方法上,還可以用在參數上,還可以用在屬性上. 但是只用在類上有效果.其他地方沒效果

@Lazy有三種寫法:@Lazy(true)   @Lazy(value=true)  @Lazy (value默認值是true)

 

 

 

 

注:@Bean的作用和@Conponent作用一樣, 但是@Bean必須寫在配置類中(配置有@SpringBootApplication注解的類, 這個注解上標注有@SpringBootConfiguration)

注:@Bean注解用在方法上表示此方法會返回一個對象並將此對象交給spring管理. bean對象的id就是方法名,bean對象的類型就是對象的類型

@Bean注解相當於xml中的<bean id="方法名"  class="類的全限定名">

@Bean一般用於spring整合其他技術時采用的, 因為其他技術可能沒辦法修改源代碼沒法給其他技術的類上標注注解來生成bean對象,所以用@bean的方式來new對象

 @Autowired方式注入

 

 

 

 

 注意: 測試getWCache方法的話可以運行測試類,也可以運行啟動類

 二.代碼:

1 package com.zyq.pi.common.cache;
2 
3 public interface Cache {
4 
5 }
 1 package com.zyq.pi.common.cache;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 @Component
 6 public class WeakCache implements Cache{
 7 
 8     public WeakCache() {
 9         System.out.println("WeakCache");
10     }
11     
12 }
 1 package com.zyq.pi.common.cache;
 2 
 3 import javax.annotation.PostConstruct;
 4 import javax.annotation.PreDestroy;
 5 
 6 import org.springframework.context.annotation.Lazy;
 7 import org.springframework.context.annotation.Scope;
 8 import org.springframework.stereotype.Component;
 9 
10 @Component
11 @Scope("singleton")
12 //@Lazy(true)
13 //@Lazy(value=true)
14 @Lazy//@Lazy注解可以用在類上, 還可以用在普通方法上,還可以用在構造方法上,還可以用在參數上,還可以用在屬性上. 但是只用在類上有效果.其他地方沒效果
15 public class DefaultCache implements Cache{
16 
17     public DefaultCache() {
18         System.out.println("DefaultCache()");
19     }
20     
21     //此方法會在對象的構造方法之后執行。
22     @PostConstruct
23     public void init() {
24         System.out.println("init()");
25     }
26     
27     //此方法會在對象銷毀之前執行
28     @PreDestroy
29     public void destory() {
30         System.out.println("destory()");
31     }
32 }
 1 package com.zyq.pi.common.cache;
 2 
 3 import org.junit.jupiter.api.Test;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.beans.factory.annotation.Qualifier;
 6 import org.springframework.boot.test.context.SpringBootTest;
 7 
 8 @SpringBootTest
 9 public class DefaultCacheTest {
10     @Autowired//先按類型注入,再按名字注入. 如果用@Qualifier指定了名字或者類型則不采取默認的方式,而采用@Qualifier指定的方式注入
11     @Qualifier("weakCache")
12     private Cache deCache;
13 
14     @Test
15     public void testCache() {
16         System.out.println(deCache);
17     }
18 
19 }
 1 package com.zyq;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.context.annotation.Bean;
 6 import org.springframework.context.annotation.Lazy;
 7 import com.zyq.pi.common.cache.WeakCache;
 8 
 9 @SpringBootApplication
10 public class SpringBootDay010728Application {
11     /*
12     @Lazy
13     @Bean
14     public WeakCache getWCache() {
15         System.out.println("getWCache");
16         return new WeakCache();
17     }*/
18     
19     public static void main(String[] args) {
20         SpringApplication.run(SpringBootDay010728Application.class, args);
21     }
22 
23 }

 

注意:  單元測試類必須在啟動類的同包下或者其的子包下, 並且單元測試類上必須用 @SpringBootTest注解標注 

 

@AutoWired注入規則:
先按照類型注入,如果有兩個同一類型的對象, 則還會基於屬性名進行查找,如果沒找到就拋出異常.
此時還可以配合@Qualifier注解指定要注入的對象名字

//如果@Autowired用構造方法給cache注入對象時,發現了兩個Cache類型的對象的話就會拋出異常,
//此時可以結合@Qualifier給構造方法的參數指定一個對象注入

1 @Autowired
2 public CacheService(@Qualifier("defaultCache")Cache cache) {
3     this.cache = cache;
4 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM