Spring 의 Null-Safety 를 깊이 분석 하 다.

6449 단어 SpringNullSafety
이전에 일부 코드 에서@Nullable 로 표 시 된 주석 을 본 적 이 있 습 니 다.그 당시 에 도 무슨 뜻 인지 신경 쓰 지 않 았 기 때문에 이 글 은 Spring 에서 Null 에 관 한 일 들 을 이야기 합 니 다.
자바 에 서 는 null 의 안전성 을 나타 내 는 형식 을 사용 할 수 없습니다.그러나 Spring Framework 는 현재 org.springframework.lang 패키지 에서 다음 과 같은 설명 을 제공 하여 API 와 필드 의 가용성 을 설명 합 니 다.
  • @Nullable:매개 변수,반환 값 또는 필드 를 null 의 주석 으로 지정 할 수 있 습 니 다.
  • @NonNull:상기 주석 과 달리 지정 한 매개 변수,반환 값 또는 필드 가 null 로 허용 되 지 않 음 을 나타 낸다.(@NonNullApi 와@NonNullFields 에 적용 되 는 인자/반환 값 과 필드 가 필요 없습니다.
  • @NonNullApi:패키지 등급 의 설명 은 null 을 매개 변수 와 반환 값 으로 하지 않 습 니 다.
  • @NonNullFields:패키지 등급 의 설명 필드 는 기본적으로 비어 있 지 않 습 니 다
  • Spring Framework 자 체 는 위의 설명 을 이용 하 였 으 나,Spring 기반 자바 프로젝트 에 도 사용 하여 빈 보안 api 와 빈 보안 필드 를 설명 할 수 있 습 니 다.범 형 과 배열 요소 의 가용성 은 지원 되 지 않 지만 곧 발 표 될 것 입 니 다.Spring Null-Safety 는 Spring 5 에 나타 나 서 빈 안전 코드 를 더욱 편리 하 게 작성 할 수 있 습 니 다.이것 은 null-safety 라 고 합 니 다.null-safety 는 안전 하지 않 은 코드 에서 벗 어 나 게 하 는 것 이 아니 라 컴 파일 할 때 경고 가 발생 합 니 다.이러한 경 고 는 실행 중 재난 성 빈 포인터 이상(NPE)을 방지 할 수 있다.
    @NonNull
    @NonNull 주석 은 null-safety 의 모든 주석 에서 가장 중요 한 것 입 니 다.이 주석 을 사용 하여 원 하 는 대상 이 인용 한 모든 곳 에서 빈 제약 이 아 닌 필드,방법 파라미터 또는 방법 으로 값 을 되 돌려 줄 수 있 습 니 다.
    예 를 들 어 보 겠 습 니 다.
    
    public class Student {
    
      private String name;
    
      public String getName() {
        return name;
      }
      public void setName(String name) {
        if(name != null && name.isEmpty()){
          name = null;
        }
        this.name = name;
      }
    }
    이 코드 는 name 에 대한 검증 에 유효 하지만 결함 이 있 습 니 다.name 이 null 로 설정 되면 name 을 사용 할 때 NullPointer Exception 으로 끝 납 니 다.
    @NonNull 사용 하기
    Spring 의 null-safety 특성 은idea또는eclipse이 잠재 적 인 위협 을 보고 할 수 있 습 니 다.예 를 들 어 우리 가 IDEA 로 속성 에@NonNull 을 더 하면 다음 과 같은 효과 가 나타 납 니 다.

    이상 하 다.변 함 이 없 잖 아.잠재 적 인 안전 힌트 를 못 봤 잖 아.그 건 네가 아이디어 에 설정 을 하지 않 았 기 때 문 이 야.
    안전 검사 설정
    만약 당신 도 힌트 가 없다 면 다음 과 같은 방식 으로 안전 검 사 를 설정 할 수 있 습 니 다.

    아직 사용 하기 어 려 우 면 오른쪽 configuration annotations 에@NonNull 과@Nullable 이 있 는 jar 가방 을 추가 하 십시오.다음 과 같 습 니 다.

    덧붙이다✅ 다음 과 같은 효 과 를 볼 수 있다.

    현재 fullName 은@NonNull 주석 에 컴 파 일 러 를 추가 하여 null 값 을 검사 합 니 다!
    만약 당신 이 믿 지 않 는 다 면,@NonNull 주석 을 삭제 하고,마 우 스 를 fullName 에 다시 놓 아 도 됩 니 다.이 알림 은 없습니다.
    @NonNullFields
    @NonNull 주 해 는 null-safety 를 확보 하 는 데 도움 이 됩 니 다.그러나 이 주석 이 모든 필드 를 직접 장식 하면 코드 라 이브 러 리 전체 가 오염 된다.
    Spring 은 null 에 허용 되 지 않 는 또 다른 주 해 를 제공 합 니 다.@NonNullFields이 설명 은 패키지 단계 에 적합 합 니 다.개발 도구 설명 패키지 의 모든 필드 를 알려 줍 니 다.기본적으로 null 로 사용 할 수 없습니다.
    Parent 클래스 를 새로 만 들 고 이 클래스 에 속 하 는 패키지 아래 에package-info.java라 는 클래스 를 만 듭 니 다.자바 클래스 가 아 닌file만 들 었 습 니 다.package-info.자바 라 는 이름 입 니 다.다음 과 같 습 니 다.
    package-info.java
    
    @NonNullFields
    package com.nullsafety.demo.pojo;
    
    import org.springframework.lang.NonNullFields;
    새 클래스Parent.java
    
    public class Parent {
    
      private String son;
      private String age;
      private String name;
    
      public void setSon(String son) {
        if(son != null && son.isEmpty()){
          son = null;
        }
        this.son = son;
      }
    
      public void setAge(String age) {
        if(age != null && age.isEmpty()){
          age = null;
        }
        this.age = age;
      }
    
      public void setName(String name) {
        if(name != null && name.isEmpty()){
          name = null;
        }
        this.name = name;
      }
    }
    package-info.자바 의@NonNullFields는 Parent 류 의 모든 속성 에 작용 할 수 있 습 니 다.마 우 스 를 임의의 속성 에 두 면 컴 파일 기간 검사 에 대한 알림 이 나타 납 니 다.

    @Nullable
    @NonNull Fields 주석 은 보통@NonNull 보다 좋 습 니 다.모델 을 줄 이 는 데 도움 이 되 기 때 문 입 니 다.그러나 때때로 우 리 는 패키지 등급 이 지정 한 비 null 제약 에서 일부 필드 를 면제 하려 고 할 때@Nullable주 해 를 사용 합 니 다.
    Person.자바,Person.자바 와 pack-info.자바 가 같은 가방 에 있 습 니 다.
    
    public class Person {
    
      @NonNull
      private String fullName;
    
      @Nullable
      private String nickName;
    
      public String getNickName() {
        return nickName;
      }
    
      public void setNickName(String nickName) {
        if(nickName != null && nickName.isEmpty()){
          nickName = null;
        }
        this.nickName = nickName;
      }
    
      public String getFullName() {
        return fullName;
      }
    
      public void setFullName(String fullName) {
        if(fullName != null && fullName.isEmpty()){
          fullName = null;
        }
        this.fullName = fullName;
      }
    }
    이 경우 필드 에@NonNullFields 의 의 미 를 덮어 쓰기 위해@Nullable 주석 을 사용 합 니 다.
    @NonNullApi@NonNullFields주석 은 이름 이 보 여 주 는 필드 에 만 적 용 됩 니 다.만약 우리 가 방법의 매개 변수 와 반환 값 에 같은 영향 을 미 치 려 면@NonNullApi 가 필요 합 니 다.
    configure annotations 에@NonNullApi 와@NonNullFields 를 추가 하고 NonNullApi 를 선택 하 십시오.

    @NonNullFields 와 마찬가지 로 package-info.java 에서 정의 해 야 합 니 다@NonNullApipackage-info.java
    
    @NonNullApi
    @NonNullFields
    package com.nullsafety.demo.pojo;
    
    import org.springframework.lang.NonNullApi;
    import org.springframework.lang.NonNullFields;
    다음 주석 을 추가 한 효 과 는 다음 과 같 습 니 다.값 을 되 돌 릴 때 컴 파일 기간 의 힌트 를 받 을 수 있 습 니 다.

    후기:
    문장 을 다 보고 나 면 너 는 적어도 이해 해 야 한다.
  • 네 개의 주해@NonNull,@Nullable,@NonNullFields,@NonNullApi 네 개의 주해 각자 의 역할 범위
  • 컴 파일 기간 을 설정 하 는 Null-safety 검사
  • 총결산
    위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 Spring 의 Null-Safety 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

    좋은 웹페이지 즐겨찾기