kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

延时加载.md

发表于 2020-08-10 更新于 2021-11-21 分类于 SpringBoot
本文字数: 1.6k 阅读时长 ≈ 1 分钟

如何将一个类加入到Spring的IOC容器中呢?Spring为我们提供了5个注解:

1.@Component

2.@Controller

3.@Service

4.@Repository

5.@Configuration

其中,@Component是最基本的注解,其他的4个注解都是基于@Component.

在现在的Spring版本中,@Controller、@Service、@Repository的作用与@Component一致,以后Spring的更新可能会增强这几个注解。

@Configuration与其他几个注解不同的是它可以将多个类加入到IOC容器,而其他注解一次只能加入一个类到IOC容器中。

细节:如果一个类没有加入到IOC容器中,而另外一个类注入了这个类,在IDEA中会报错。当然,可以设置IDEA的报错级别。最好的办法是设置@Autowired(required = false),这样这个类不是必须的,服务器可以正常启动。要注意的是,如果有地方调用了这个类的方法,会引起NullPointException.

Spring中的对象实例化的时机?

我们猜测,对象的实例化时机有以下两种情况:

1.当要使用到对象的时候进行实例化。比如Controller,是在访问了url的时候,IOC容器才实例化Controller

2.当IOC容器启动的时候实例化。比如服务器启动,所有的对象都会被实例化。

通过在类的构造方法中添加输出语句,在服务器启动的时候就输出了语句,可以知道第二种情况是Spring种默认的实例化Bean的方式。

延迟加载

那有什么办法可以延迟实例化Bean吗?这时候就得请出来大哥——@Lazy

我们举个栗子。在下面的类中添加@Lazy注解:

1
2
3
4
5
6
7
8
9
10
11
12
@Component
@Lazy
public class Diana{

public Diana(){
System.out.println("Diana start");
}

public void R(){
System.out.println("Diana R");
}
}

在别的类中注入Diana这个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@RequestMapping("/v1/banner")
public class BannerController {

@Autowired
private Diana diana;

@GetMapping(value = "test")
public Map<String,Object> test() {
Map<String,Object> map = new HashMap<>();
map.put("id","1");
map.put("name","王小喵2");
return map;
}
}

此时,Diana就可以被延迟加载了吗?

答案是否定的。在控制台的输出结果中,还是出现了Diana Start。也就是在IOC容器启动的时候,Diana就被实例化了。

咦,那是哪里出了问题呢?问题在于BannerController中注入了Diana。如果一个类想要延时加载,必须保证其他类没有使用到它。不然使用了该类的其他类也需要延时加载。说起来有点绕,意思就是说BannerController注入了Diana类,而Diana类想要延时加载,那么BannerController类也需要加上@Lazy注解进行延时加载。

加上注解后验证,Diana和BannerController都被延迟加载了。那么,它们在什么时候会被实例化呢?没错,在使用到它们的时候就会被实例化。我们在浏览器中访问BannerController对应的url,控制台输出Diana Start,它们被实例化了。推测✔

注意:除非有特别好的理由,否则不推荐使用延时加载

一毛也是爱~
Kim.Zhang 微信支付

微信支付

# 延时加载
CyclicBarrier.md
Autowaired.md
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%