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

Spring非常實用的技巧,你確定知道?

開發 前端
在Spring框架中,@Nullable注解為我們提供了一種機制來處理可能為null的字段或參數。通過使用@Nullable,我們可以明確告知Spring容器某字段或參數可能是null,從而避免因未注入而導致的運行時錯誤。

環境:Spring5.3.23

1. 簡介

在Spring框架中,依賴注入是實現組件間解耦的重要手段。然而,當嘗試注入一個不存在的Bean時,程序通常會報錯,這可能導致應用程序無法正常啟動。

為了解決這個問題,我們將介紹一些最佳實踐和技巧,幫助開發者在編寫代碼時避免此類錯誤。例如,通過@Autowired(required = false)將required設置為false或者通過Optional來避免此類異常情況。但是本文將要介紹另外一種解決辦法。

2. 重現錯誤

static class PersonDAO {
}
@Component 
static class PersonService {
  @Autowired
  private PersonDAO dao ;
  public void find(Integer id) {
    System.out.println("id = " + id.toString()) ;
  }
}

上面的PersonDAO類并沒有被注冊為Bean,但在PersonService類中使用了@Autowired進行注入,在這種情況下程序啟動就會報錯。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.pack.main.autowired_resource.ResourceInjectAndNullableMain2$PersonDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1801)

錯誤意思就是期望一個PersonDAO,但是容器中并沒有這個類。

如果真有這種情況,要解決這個問題我們可以通過設置@Autowired屬性required為false。這樣啟動就不會報錯了。當然這是其中一種方法,其實還有其它的方式解決。

  • 【Spring揭秘】ObjectProvider:讓依賴注入更加靈活和安全這篇文章詳細的介紹了如何使用ObjectProvider
  • Optional
  • ObjectFactory這種方式會在調用getObject方法的時候報錯(如果不存在時)。

通過上面3中方式都可以解決當不存在的時候,容器啟動不至于報錯。但是今天我們可不是講這些。今天我們要將的是@Nullable注解

3. @Nullable注解

直接上代碼,示例1:

@Nullable
@Autowired
private PersonDAO dao ;

通過該注解程序啟動將不會報錯了,我這里使用的是spring包下的。org.springframework.lang.Nullable。

示例2:

@javax.annotation.Nullable
@Autowired
private PersonDAO dao ;

程序同樣正常啟動

是不是說只要加了Spring的或者是java自己的@Nullable就可以了呢?接著往下看

示例3:

自定義Nullable注解

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
static @interface Nullable {
}

接著使用上面自定義的注解,發現程序啟動也不會報錯。是不是很神奇?Spring又是如何處理的呢?

4. 原理

Spring在注入一個對象時都,在這個過程中它會將你要注入的對象包裝成DependencyDescriptor,在該類中有個isRequire方法

public class DependencyDescriptor extends InjectionPoint {
  // 判斷注入對象是不是必須的
  public boolean isRequired() {
    // 是否對@Autuwored配置了required屬性,設置為false。
    if (!this.required) {
      return false;
    }


    if (this.field != null) {
      // hasNullableAnnotation判斷是否有@Nullable注解
      return !(this.field.getType() == Optional.class || hasNullableAnnotation() ||
          (KotlinDetector.isKotlinReflectPresent() &&
              KotlinDetector.isKotlinType(this.field.getDeclaringClass()) &&
              KotlinDelegate.isNullable(this.field)));
    } else {
      return !obtainMethodParameter().isOptional();
    }
  }
  private boolean hasNullableAnnotation() {
    // 遍歷字段上的所有注解
    for (Annotation ann : getAnnotations()) {
      // 這里的判斷,僅僅是判斷你的類名是否為Nullable,并不關心具體是哪個包下的注解
      if ("Nullable".equals(ann.annotationType().getSimpleName())) {
        return true;
      }
    }
    return false;
  }
}

我們還可以將注解加到方法參數上,一樣是生效的

@Autowired
public void setDao(@Nullable PersonDAO dao) {
  this.dao = dao ;
}

總結:在Spring框架中,@Nullable注解為我們提供了一種機制來處理可能為null的字段或參數。通過使用@Nullable,我們可以明確告知Spring容器某字段或參數可能是null,從而避免因未注入而導致的運行時錯誤。

@Nullable注解的使用非常簡單,只需在字段,方法參數上添加該注解即可。Spring會在依賴注入時檢查是否存在相應的字段,如果不存在,則不會拋出異常,而是將該類或字段的值設置為null。

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2022-09-15 07:05:09

Windows電腦技巧

2021-04-12 15:54:45

Android 開發技巧

2023-01-09 17:23:14

CSS技巧

2022-09-20 11:58:27

NpmNode.js

2024-12-27 08:43:17

2016-05-10 10:16:13

JavaScript技巧

2017-09-05 08:57:02

Linux命令行技巧

2022-07-06 15:51:48

瀏覽器開發者工具

2020-07-11 09:45:33

Python編程語言開發

2023-09-21 12:37:34

IDEA

2020-05-28 08:59:40

Python機器學習開發

2022-11-01 15:57:44

2013-01-09 13:55:43

2021-09-24 14:20:25

開發技能工具

2011-03-25 15:56:58

2021-06-04 10:11:07

鴻蒙安卓操作系統

2020-09-23 09:13:47

Docker

2023-10-30 09:10:05

DjangoQuerySet

2011-05-19 13:15:44

PHP

2011-07-07 09:01:52

HTML 5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产视频中文字幕在线观看 | 亚洲乱码国产乱码精品精98午夜 | 中文在线一区二区 | 99久久久久久99国产精品免 | 欧美三级视频 | 美女国产一区 | 一区二区欧美在线 | 欧美一级一 | 狠狠色狠狠色综合系列 | 欧美日韩美女 | 午夜影院在线观看免费 | 色天堂影院| 国产成人精品免高潮在线观看 | 国产精品一区二区三区在线 | 亚洲视频在线观看 | 久久久男人的天堂 | 亚洲一区三区在线观看 | 激情婷婷 | 亚洲一区国产精品 | 91成人午夜性a一级毛片 | 国产日韩欧美在线播放 | 羞羞的视频免费在线观看 | 一二三四在线视频观看社区 | www.99精品 | 日日摸日日爽 | 中文字幕电影在线观看 | 婷婷综合色 | www久久99 | 欧美综合精品 | 亚州精品天堂中文字幕 | 久久久精品网 | 日韩精品一区二区三区视频播放 | 激情 一区 | 天天拍天天插 | 黑人一级黄色大片 | av一级久久 | 日韩精品成人一区二区三区视频 | 岛国二区| h视频免费在线观看 | 日本精品一区二区三区在线观看视频 | 日本黄色激情视频 |