一.代码截图:

 

 

 

@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 }