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诞生以来,
随机推荐
- sass安装与教程
首先下载ruby http://dlsw.baidu.com/sw-search-sp/soft/ff/22711/rubyinstaller_V2.2.2.95_setup.1439890355.e ...
- vue 3.0 体验,vue 3.0新特性
前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...
- 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战
本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...
- 数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!
https://zhuanlan.zhihu.com/p/55841964 时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中 ...
- python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法
类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...
- 题解 CF1354D 【Multiset】
考试拿到题,一看,这不是权值线段树吗? 思路 使用线段树每个节点维护该区间内元素出现次数. 根据题目,对于加入.删除元素,我们可以单点修改(\(+1\).\(-1\)),对于输出,我们可 随便 遍历找 ...
- echarts 踩坑 : 为什么效果出不来?看看有没有正确引入
今天我要给 echarts 组件加个 dataZoom 功能,结果发现没有效果. 后来发现是引入 echarts 模块的问题. 如果是按需引入的话,必须引入相应的功能模块才能使用相应的功能. 举例: ...
- 题解 洛谷 P2086 【[NOI2012]魔幻棋盘】
先考虑只有一维的情况,要求支持区间加和求区间 \(\gcd\),根据 \(\gcd\) 的性质,发现: \[ \gcd(a_1,a_2,a_3,\ldots a_n)=\gcd(a_i,a_2-a_1 ...
- 一文入门DNS?从访问GitHub开始
前言 大家都是做开发的,都有GitHub的账号,在日常使用中肯定会遇到这种情况,在不修改任何配置的情况下,有时可以正常访问GitHub,有时又直接未响应,来一起捋捋到底是为啥. GitHub访问的千层 ...
- 超简单的jq图片上传
<label class="file_img" for="file_imgs"> <input class="file_imgs&q ...