一.代碼截圖:
@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 }