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诞生以来,
随机推荐
- 常用API - Scanner、Random、ArrayList
API 概述 API(Application Programming Interface),应用程序编程接口. Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档. 这些类 ...
- NanoPi arm架构下的程序 ./ 运行黑屏 Qt环境可运行
首先之所以QtCreator环境下可直接运行,但是在终端下 ./ 则不能运行(黑屏但是不报错),判断肯定不是程序或者是库的问题.于是猜想是环境问题,即终端环境与QtCreator环境不同. 然后就查看 ...
- day46 作业
# 班级表 create table class( cid int primary key auto_increment, caption char(16) ); # 学生表 create table ...
- Redis 相关运维操作
背景 Redis作为目前全球最流行的KV存储,除了使用之外,还需要做好日常的运维工作.关于运维相关的工作,本文从以下方面进行介绍说明(Redis5.0以上): 内存方面 客户端连接方面 工具方面 说明 ...
- 《你还在写sql语句吗?》人生苦短,进入MybatisPlus的丝滑体验
一.发展历程 依稀记得大学期间,类中写sql语句的日子,一个sql语句占据了大部分时间,到后来hibernate的出现算是解决了这一痛点.工作 后,我们又接触到了mybatis这样的框架,瞬间感觉这个 ...
- Oracle Database Tools
The following are some products, tools, and utilities you can use to achieve your goals as a databas ...
- Logging with ElasticSearch, Kibana, ASP.NET Core and Docker
好久不见,前两周经历了人生第一次"伪牛市",基金和股市大起大落,更加坚信"你永远赚不到超出你认知范围之外的钱,除非靠着运气",老韭菜诚不欺我也. 当能力与野心不 ...
- 高效C++:构造/析构/赋值
了解C++默认提供和调用的函数 编译器会自动为每一个空类创建构造函数.拷贝构造函数.赋值运算符以及析构函数 不要使用编译器自动创建的函数,要杜绝这种情况发生,自己编写这些函数 如果不想使用编译器自动生 ...
- Android Studio报错问题集锦
Android Studio使用过程中坑太多,动不动就报错,每次出现问题都是上百度去搜索,需要花费很大的时间和精力才能解决掉问题. 为了以后更高效的使用这款工具,在这里记录下来我已经踩过的坑和即将要踩 ...
- js 绑定的键盘事件
在全局绑定键盘事件 document.onkeydown = function(event){ //在全局中绑定按下事件 var e = event || window.e; va ...