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方法的话可以运行测试类,也可以运行启动类
二.代码:
package com.zyq.pi.common.cache;
public interface Cache {
}
package com.zyq.pi.common.cache; import org.springframework.stereotype.Component; @Component
public class WeakCache implements Cache{ public WeakCache() {
System.out.println("WeakCache");
} }
package com.zyq.pi.common.cache; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; @Component
@Scope("singleton")
//@Lazy(true)
//@Lazy(value=true)
@Lazy//@Lazy注解可以用在类上, 还可以用在普通方法上,还可以用在构造方法上,还可以用在参数上,还可以用在属性上. 但是只用在类上有效果.其他地方没效果
public class DefaultCache implements Cache{ public DefaultCache() {
System.out.println("DefaultCache()");
} //此方法会在对象的构造方法之后执行。
@PostConstruct
public void init() {
System.out.println("init()");
} //此方法会在对象销毁之前执行
@PreDestroy
public void destory() {
System.out.println("destory()");
}
}
package com.zyq.pi.common.cache; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest
public class DefaultCacheTest {
@Autowired//先按类型注入,再按名字注入. 如果用@Qualifier指定了名字或者类型则不采取默认的方式,而采用@Qualifier指定的方式注入
@Qualifier("weakCache")
private Cache deCache; @Test
public void testCache() {
System.out.println(deCache);
} }
package com.zyq; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;
import com.zyq.pi.common.cache.WeakCache; @SpringBootApplication
public class SpringBootDay010728Application {
/*
@Lazy
@Bean
public WeakCache getWCache() {
System.out.println("getWCache");
return new WeakCache();
}*/ public static void main(String[] args) {
SpringApplication.run(SpringBootDay010728Application.class, args);
} }
注意: 单元测试类必须在启动类的同包下或者其的子包下, 并且单元测试类上必须用 @SpringBootTest注解标注
@AutoWired注入规则:
先按照类型注入,如果有两个同一类型的对象, 则还会基于属性名进行查找,如果没找到就抛出异常.
此时还可以配合@Qualifier注解指定要注入的对象名字
//如果@Autowired用构造方法给cache注入对象时,发现了两个Cache类型的对象的话就会抛出异常,
//此时可以结合@Qualifier给构造方法的参数指定一个对象注入
@Autowired
public CacheService(@Qualifier("defaultCache")Cache cache) {
this.cache = cache;
}
AutoWired注解和Lazy延迟加载的更多相关文章
- spring注解之@Lazy
今天主要从以下几方面来介绍一下@Lazy注解 @Lazy注解是什么 @Lazy注解怎么使用 1,@Lazy注解是什么 @Lazy注解用于标识bean是否需要延迟加载,源码如下: @Target({ ...
- Spring Ioc源码分析系列--@Autowired注解的实现原理
Spring Ioc源码分析系列--@Autowired注解的实现原理 前言 前面系列文章分析了一把Spring Ioc的源码,是不是云里雾里,感觉并没有跟实际开发搭上半毛钱关系?看了一遍下来,对我的 ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...
- @Autowired注解的使用
使用Spring时,通过Spring注入的Bean一般都被定义成private,并且要有getter和setter方法,显得比较繁琐,增加了代码量,而且有时会搞忘造成错误. 可以使用@Autowire ...
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
- 转:Spring中@Autowired注解、@Resource注解的区别
Pay attention: When using these annotations, the object itself has to be created by Spring context. ...
- Spring中@Autowired注解与自动装配
1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ...
- @Resource 和 @Autowired注解的异同
@Resource 和 @Autowired注解的异同 @Autowired 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false 例 ...
- @Autowired注解(转)
5.6.4 @Autowired注解 自Spring诞生以来,
随机推荐
- cf1216E2 Numerical Sequence (hard version) 二分查找、思维题
题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...
- day46 作业
# 班级表 create table class( cid int primary key auto_increment, caption char(16) ); # 学生表 create table ...
- scrapy 源码解析 (五):启动流程源码分析(五) Scraper刮取器
Scraper刮取器 对ExecutionEngine执行引擎篇出现的Scraper进行展开.Scraper的主要作用是对spider中间件进行管理,通过中间件完成请求.响应.数据分析等工作. Scr ...
- SpringBoot2 整合JTA组件,多数据源事务管理
本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...
- 网络编程-HTTPS
明文: 对称加密: 非对称:(公钥:pk 私钥:sk) 对称+非对称: 先用非对称方式发送num1给server,server用私钥得出key(由num1算出来),自此,约定C.S以此key(num1 ...
- 微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app
以前微信浏览器内想要直接唤醒 app 要么接微信的应用宝要么你是腾讯的干儿子. 而在微信在2020年5月分推出了“微信开放标签”功能 wx-open-launch-app 用于微信浏览器内直接唤醒 a ...
- static关键字真能提高Bean的优先级吗?答:真能
生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...
- Python Ethical Hacking - DNS Spoofing
What is DNS Spoofing Sniff the DNSRR packet and show on the terminal. #!/usr/bin/env python from net ...
- Redis中的Scan命令踩坑记
1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限.所以记录下这 ...
- javascript兼容性:展开运算符 ... 的降级
展开运算符 ... 是一个很好用的ES6新特性,用的好的话,可以节约很多代码. 但是作为ES6特性,它有兼容性问题,而且Babal(在线转码网页)并不会转换展开运算符. 展开运算符大体分为两种用法:展 ...