一.代码截图:
@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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构