成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發(fā)技巧!@Lazy注解這5種用法非常實(shí)用

開發(fā) 前端
Spring中的@Lazy注解主要用于實(shí)現(xiàn)惰性加載(延遲加載),它可以應(yīng)用在類、方法、構(gòu)造方法、參數(shù)和字段上。以下是@Lazy注解的作用、應(yīng)用場(chǎng)景

環(huán)境:Spring6.1.8

1. 簡介

Spring中的@Lazy注解主要用于實(shí)現(xiàn)惰性加載(延遲加載),它可以應(yīng)用在類、方法、構(gòu)造方法、參數(shù)和字段上。以下是@Lazy注解的作用、應(yīng)用場(chǎng)景。

1.1 作用

在Spring框架中,默認(rèn)情況下,所有的Bean在容器啟動(dòng)時(shí)都會(huì)被初始化。但是,有些Bean的初始化可能涉及到一些重量級(jí)的操作,如網(wǎng)絡(luò)IO操作、復(fù)雜計(jì)算等,這些操作會(huì)消耗大量的系統(tǒng)資源。通過使用@Lazy注解,可以讓這些Bean在真正需要時(shí)才進(jìn)行初始化,從而提高系統(tǒng)的啟動(dòng)速度和性能。

1.2 應(yīng)用場(chǎng)景

  • 提升系統(tǒng)啟動(dòng)速度:當(dāng)應(yīng)用包含大量的Bean,如果存在某些Bean初始化操作非常耗時(shí)(如網(wǎng)絡(luò)IO操作或復(fù)雜耗時(shí)計(jì)算),通過@Lazy注解可以顯著提升系統(tǒng)的啟動(dòng)速度。如:應(yīng)用啟動(dòng)時(shí),需要從Redis讀取大量的緩存數(shù)據(jù),如果將此Bean使用@Lazy標(biāo)注,那么應(yīng)用啟動(dòng)會(huì)非??欤?dāng)在使用緩存服務(wù)時(shí)才去讀取redis初始化數(shù)據(jù)。
  • 解決循環(huán)依賴:如果兩個(gè)Bean之間存在循環(huán)依賴,即A依賴B,B又依賴A(構(gòu)造函數(shù)注入),這會(huì)導(dǎo)致Spring容器在初始化這些Bean時(shí)陷入死循環(huán)。使用@Lazy注解可以解決這類問題。
  • 單例Bean正確注入多例Bean:如果A是單例,B是多例,在A中注入B實(shí)例,要想正確的注入(每次使用B時(shí)都是新對(duì)象)通過使用@Lazy能夠輕松解決。

以上是關(guān)于@Lazy注解的簡介及應(yīng)用場(chǎng)景,接下來將詳細(xì)介紹@Lazy的5種使用方式。

2. 實(shí)戰(zhàn)案例

2.1 環(huán)境準(zhǔn)備

public class PersonDAO {
}
public class PersonService {
   private PersonDAO dao ;
   
   public String toString() {
     return "PersonService [dao=" + dao.getClass() + "]";
   }
}
// 測(cè)試入口代碼
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
  context.register(PersonDAO.class) ;
  context.register(PersonService.class) ;
  context.refresh() ;


  System.out.println(context.getBean(PersonService.class)) ;
}

接下的每個(gè)示例都將基于上面的類進(jìn)行。

2.2 字段注入

// @Resource
// @Autowired
@Lazy
private PersonDAO dao ;

輸出結(jié)果

PersonService [dao=class com.pack.PersonDAO$$SpringCGLIB$$0]

通過@Lazy標(biāo)注的字段,最終注入的是代理類(不管上面使用的@Resource還是@Autowired)。

注:在上面測(cè)試入口代碼中,我們使用的是AnnotationConfigApplicationContext,如果你使用的是GenericApplicationContext那么在默認(rèn)情況下@Autowired是不會(huì)生效的,這時(shí)候你還需要做如下設(shè)置:

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory() ;
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()) ;

將此BeanFactory設(shè)置到ApplicationContext中即可。

2.3 方法注入

@Resource
@Lazy
public void setPersonDAO(PersonDAO dao) {
  this.dao = dao ;
}

輸出結(jié)果

PersonService [dao=class com.pack.PersonDAO$$SpringCGLIB$$0]

同樣的生成了代理。

方法注入,你還可以將@Lazy放到方法參數(shù)上,如下示例:

@Resource
public void setPersonDAO(@Lazy PersonDAO dao) {
  this.dao = dao ;
}

這種方式也是會(huì)被生成代理對(duì)象。

2.4 構(gòu)造函數(shù)注入

@Lazy
public PersonService(PersonDAO dao) {
  this.dao = dao ;
}

輸出結(jié)果

PersonService [dao=class com.pack.PersonDAO$$SpringCGLIB$$0]

同樣,注解也可以使用在參數(shù)上

public PersonService(@Lazy PersonDAO dao) {
  this.dao = dao ;
}

構(gòu)造函數(shù)注入與方法注入基本一致。

2.5 單例Bean注入多例Bean

修改PersonDAO;

@Scope("prototype")
public class PersonDAO {
}

通過@Scope將其聲明為多例。

修改PersonService隨意添加一個(gè)方法。

public class PersonService {
  @Autowired
  private PersonDAO dao ;
  public void save() {
    System.out.printf("PersonDAO hashCode: %s%n", dao) ;
  }
}

測(cè)試類:

PersonService ps = context.getBean(PersonService.class);
ps.save() ;
ps.save() ;
ps.save() ;

當(dāng)dao字段上不添加@Lazy注解時(shí),輸出結(jié)果:

PersonDAO hashCode: com.pack.PersonDAO@66565121
PersonDAO hashCode: com.pack.PersonDAO@66565121
PersonDAO hashCode: com.pack.PersonDAO@66565121

每次都是同一個(gè)對(duì)象,這不是我們期望的結(jié)果

dao字段添加@Lazy注解后,再次運(yùn)行

PersonDAO hashCode: com.pack.PersonDAO@73a2e526
PersonDAO hashCode: com.pack.PersonDAO@13f95696
PersonDAO hashCode: com.pack.PersonDAO@68be8808

正確的輸出結(jié)果,每次使用都是不同的實(shí)例。

2.6 循環(huán)依賴

class class A {
  private B b ;
  public A(B b) {
    this.b = b ;
  }
}
public class B {
  private A a ;
  public B(A a) {
    this.a = a ;
  }
}

上面的依賴通過構(gòu)造方法注入,這種情況下容器啟動(dòng)是會(huì)報(bào)錯(cuò)的,如下:

圖片圖片

出現(xiàn)循環(huán)依賴錯(cuò)誤,通過@Lazy注解解決此問題,只需要在任意類的構(gòu)造函數(shù)上使用@Lazy注解,如下:

public A(@Lazy B b) {
  this.b = b ;
}

只需要在其中一方加入了@Lazy注解后,問題得到解決。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2011-07-07 09:01:52

HTML 5

2024-12-27 08:43:17

2016-05-10 10:16:13

JavaScript技巧

2017-09-05 08:57:02

Linux命令行技巧

2023-12-27 14:04:00

Spring框架參數(shù)

2023-09-21 12:37:34

IDEA

2020-05-28 08:59:40

Python機(jī)器學(xué)習(xí)開發(fā)

2011-05-19 13:15:44

PHP

2022-11-01 15:57:44

2020-09-23 09:13:47

Docker

2022-10-11 08:00:47

多線程開發(fā)技巧

2024-07-26 08:19:09

2020-08-14 10:57:49

開發(fā)技能代碼

2010-07-21 11:26:07

SQL Server

2021-10-22 10:05:19

wget命令Linux

2009-05-25 09:00:45

Javascript免費(fèi)工具Javascript框

2021-01-26 12:16:00

Python開發(fā)工具

2024-12-04 16:56:50

命令Windowscmd

2024-12-03 15:59:56

2020-08-21 10:25:02

PythonWget
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美在 | 久久久久一区二区三区四区 | 久久综合伊人 | 在线观看国产网站 | www.亚洲| 成人在线一区二区三区 | www.日日夜夜 | 久草在线免费资源 | 久久久成人免费一区二区 | 中文字幕一二三区 | 久久久99精品免费观看 | 久久久久久久久久久蜜桃 | 成人精品高清 | 欧美精品在线免费观看 | 久久久久久亚洲精品 | 91看片在线| 99re在线视频免费观看 | 国产一区2区 | 国产成人99久久亚洲综合精品 | 精品久久久久久久久久久久久久 | 天天夜天天操 | 国产综合精品一区二区三区 | 久久一二区| 亚洲国产欧美一区 | 一区二区三区欧美在线观看 | 欧美日韩在线综合 | 久久久五月天 | 欧美最猛性xxxxx亚洲精品 | 色女人天堂 | 亚洲 中文 欧美 日韩 在线观看 | 91精品国产日韩91久久久久久 | 91精品国产色综合久久 | 天天澡天天狠天天天做 | 亚洲精品无人区 | 国产午夜精品久久久 | 久久亚洲国产精品日日av夜夜 | 91精品久久 | 婷婷久久网 | 亚洲欧美一区二区三区情侣bbw | 一级毛毛片 | 欧美1区2区 |