spring DI 의존 주입 방식 과 차이 점

6985 단어 springDI의존 주입
spring DI
Spring 프레임 워 크 가 Java 개발 에 대한 중요성 은 두말 할 필요 도 없다.그 핵심 적 인 특성 은 IOC(Inversion of Control,반전 제어)와 AOP 이다.평소에 가장 많이 사용 하 는 것 이 바로 그 중의 IOC 이다.우 리 는 구성 요 소 를 Spring 의 IOC 용기 에 맡 겨 관리 함으로써 대상 의 의존 관 계 를 Spring 에 의 해 제어 하고 하 드 코딩 으로 인 한 과도 한 프로그램 결합 을 피한다.
3 가지 DI 주해 의 차이
1 @Autowired
사용 특성
  • Autowired 주 해 는 spring 프레임 워 크 가 제공 하 는
  • Autowired 주석 우선 byType 자바 bean 가 져 오기,그 다음 byName
  • Autowired 주해 와 Qualifier 주해 에 맞추어 자바 bean 의 이름 을 구분 합 니 다.주로 같은 유형의 자바 bean 에 여러 개의 실
  • 이 있 습 니 다.
  • Autowired 주해 주입 대상 은 일반적으로 null 이 아 닌 것 을 요구 합 니 다.null 로 허용 되면 required=false 속성 성명
  • 이 필요 합 니 다.
  • @Autowired 는 변수,setter 방법,구조 함수 에 작용 할 수 있 습 니 다
  • 사용 과정
    a.@autoword 를 주 입 된 구성원 변수 에 쓰 면 xml 파일 에 설정 하지 않 고 프로그램 에서 해당 하 는 setter 와 getter 방법 을 제거 합 니 다.
    b.구조 방법,setter 방법 에 도 쓸 수 있 습 니 다.

    c、@Qualifier
    @Qualifier("XXX")의 XX 는 Bean 의 이름 이기 때문에@Autowired 와@Qualifier 를 결합 하여 사용 할 때 자동 으로 주입 하 는 정책 이 by Type 에서 by Name 으로 바 뀌 었 습 니 다.
    그러나 주의해 야 할 것 은@Autowired 는 구성원 변수,방법 및 구조 함 수 를 주석 할 수 있 고@Qualifier 의 레이 블 대상 은 구성원 변수,방법 입 참,구조 함수 입 참 입 니 다.

    2 @Inject
    사용 특성
  • @Inject 는 JSR 330(Dependency Injection for Java)의 규범 으로 javax.inject.Inject 를 가 져 와 야 합 니 다.주입 실현
  • @Inject 는 유형 에 따라 자동 으로 조립 되 며,명칭 에 따라 조립 해 야 할 경우@Named
  • 와 협조 해 야 합 니 다.
  • @Inject 는 변수,setter 방법,구조 함수 에 작용 할 수 있 습 니 다
  • @Autowired 와 유사 하 게 사용 되 며,그 에 비해 spring 이 제공 하 는@Autowired 를 사용 하 는 것 이 더 보편적 입 니 다
  • 사용 과정
    a.@Inject 를 변수,setter 방법,구조 함수 에 사용 할 수 있 습 니 다.@Autowired 와 같 습 니 다.

    b、@Named
    @Named("XXX")의 XX 는 Bean 의 이름 이기 때문에@Inject 와@Named 를 결합 하여 사용 할 때 자동 으로 주 입 된 정책 이 by Type 에서 by Name 으로 바 뀌 었 습 니 다.

    3 @Resource
    사용 특성
  • esource 주 해 는 jdk 가 제공 한 것 으로 j2ee 규범
  • 에 속한다.
  • 리 소스 주석 우선 byname 자바 bean 가 져 오기,그 다음 byType
  • 리 소스 주해 의 속성 이름 은 자바 bean 의 이름 으로 찾 습 니 다.name 매개 변수 가 있 으 면 name 매개 변수 로 자바 bean
  • 을 찾 습 니 다.
  • 리 소스 설명 name 속성 이 밝 혀 지면 name 에 따라 대상 을 찾 아야 합 니 다.형식 으로 찾 지 않 습 니 다
  • @Resource 는 변수,setter 방법 에 작용 할 수 있 습 니 다
  • 사용 과정
    a,@Resource 실례

    3 가지 주입 방식 의 차이
    주의 항
  • 주입 방식:field 주입,setter 주입 과 구조 기 주입
  • spring 은 setter 방법 과 구조 기 를 사용 하여 Autowired 의 bean 대상 을 주입 하 는 것 을 추천 합 니 다.따라서 IDEA 등 도구 에서 개인 속성 은 Autowired 주입 을 사용 하면 경 고 를 알 립 니 다.setter 방법 과 구조 기 주입 방식 은 대상 이 spring 에 의존 하지 않 고 독립 적 으로 사용 할 수 있 고 더욱 유연 합 니 다.개인 속성 은 spring 컨 텍스트 를 통 해 만 자동 으로 주입 할 수 있 으 며,주입 에 실패 하면 다시 주입 하 는 방식 이 없습니다.
  • @Resource 는 구조 기 주입 에 사용 할 수 없습니다
  • 1 field 주입
    
    @Controller
    public class FooController {
      @Autowired
      //@Inject
      private FooService fooService;
      
      //       ,  
      public List<Foo> listFoo() {
          return fooService.list();
      }
    }
    
    이런 주입 방식 은 가장 흔히 볼 수 있 는 주입 방식 이 어야 한다.이 유 는 간단 하 다.
  • 주입 방식 이 간단 합 니 다.주입 할 필드 를 추가 하고@Autowired 를 첨부 하면 완성 할 수 있 습 니 다.
  • 전체 코드 를 간결 하고 명료 하 게 하여 아름 답 고 대범 해 보인다.
  • 2 구조 기 주입
    
    @Controller
    public class FooController {
      
      private final FooService fooService;
      
      @Autowired
      public FooController(FooService fooService) {
          this.fooService = fooService;
      }
      
      //      , 
    }
    
    Spring4.x 버 전에 서 추천 하 는 주입 방식 은 field 주입 방식 에 비해 약간 보기 흉 하 다.특히 주입 의존 도가 많 을 때(5 개 이상)코드 가 비대 하 다 는 것 을 뚜렷하게 발견 할 수 있다.
    구조 기 주입 의 장점 은 뒤에서 단독으로 토론 한다.
    3 setter 주입
    
    @Controller
    public class FooController {
      
      private FooService fooService;
      
      //      , 
      @Autowired
      public void setFooService(FooService fooService) {
          this.fooService = fooService;
      }
    }
    
    Spring3.x 가 처음 출시 되 었 을 때 주입 을 추천 한 것 은 바로 이런 것 입 니 다.지금 은 이런 주해 방식 을 사용 하지 않 고 쓰기 가 번 거 로 웠 습 니 다.처음에 Spring 을 추천 한 것 도 그의 일리 가 있 습 니 다.구조 기 주입 매개 변수 가 너무 많아 서 육중 해 보 였 습 니 다.또한 setter 의 방식 은 종 류 를 나중에 다시 설정 하거나 다시 주입 할 수 있 습 니 다.
    구조 기 주입 의 장점
    Spring 은 문서 에서 뭐라고 말 합 니까?
    The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.
    구조 기 주입 방식 은 주 입 된 구성 요소 가 변 하지 않 고 필요 한 의존 도가 비어 있 지 않도록 보장 할 수 있 습 니 다.그 밖 에 구조 기 가 주입 하 는 의존 도 는 항상 클 라 이언 트(구성 요소)코드 를 되 돌려 줄 때 완전히 초기 화 된 상 태 를 확보 할 수 있 습 니 다.
    1 의존 불가 변
    속성 사용 final 키워드 수식
    2 의지 가 헛 되 지 않 는 다
    (우리 가 null 에 대한 검 사 를 생략 했다)
    클래스 를 예화 하려 면 클래스 가 매개 변수 가 있 는 구조 함 수 를 실 현 했 기 때문에 기본 구조 함 수 를 호출 하지 않 습 니 다.그러면 Spring 용기 가 필요 한 매개 변 수 를 입력 해 야 하기 때문에 두 가지 상황 이 있 습 니 다.1.이 유형의 매개 변수->입력,OK.2:이 유형의 인자 가 없습니다.->오류 가 발생 했 습 니 다.그래서 비어 있 지 않 을 것 을 보증 합 니 다.Spring 은 null 을 전송 하지 않 을 것 입 니 다.
    field 주입 을 사용 하면 단점 이 분명 합 니 다.호출 하지 않 으 면 NPE 의 존 재 를 발견 할 수 없 기 때 문 입 니 다.
    3 상태 초기 화
    이것 은 위의 의존 이 비어 있 지 않 은 것 과 결합 하여 구조 기 에 인삼 을 전달 하기 전에 주입 한 내용 이 비어 있 지 않도록 해 야 한다.그러면 반드시 구성 요소 에 의존 하 는 구조 방법 을 호출 하여 실례 화 를 완성 해 야 한다.자바 류 가 실례 화 되 는 과정 에서 구조 방법 은 마지막 단계 이다.그래서 돌아 온 것 은 모두 초기 화 된 상태 입 니 다.
    4 순환 의존 피하 기
    field 주입 을 사용 하면 순환 의존 을 초래 할 수 있 습 니 다.즉,A 안에 B 를 주입 하고 B 안에 A 를 주입 합 니 다.
    
    public class A {
        @Autowired
        private B b;
    }
    ​
    public class B {
        @Autowired
        private A a;
    }
    
    구조 기 주입 을 사용 하여 spring 프로젝트 가 시 작 될 때 던 집 니 다:Bean Currently InCreation 예외:Requestion bean is currently in creation:Is there an unresolvable circular reference?순환 의존 을 피하 라 고 일 깨 워 준다.
    field 주입 이 라면 시작 할 때 오류 가 발생 하지 않 고 그 bean 을 사용 할 때 오류 가 발생 합 니 다.
    총화
  • 의존 불가 변 보증(final 키워드)
  • 의존 이 헛 되 지 않도록 보증 합 니 다(우리 가 그 검 사 를 생략 합 니 다)
  • 순환 의존 을 피 했다
  • 여러 개의 실현 에 의존 하 는 사용 이 있 을 때 field 주입 또는 setter 주입 방식 으로 주입 유형 을 지정 하 는 것 을 추천 합 니 다
  • Q1:3.x 에서 말 한 것 처럼 내 가 대량의 의존 을 가지 고 주입 해 야 한다 면 구조 방법 이 비대 해 보이 지 않 을 까?
    이 문제 에 대해 당신 의 클래스 에 너무 많은 책임 이 있다 는 것 을 설명 한다.그러면 당신 은 자신 이 클래스 의 단일 성 직책 원칙 을 위 반 했 는 지 잘 생각해 서 이렇게 많은 의존 을 주입 해 야 한다.
    Q2:다른 주입 방식 은 모두 적합 하지 않 습 니까?
    존재 가 합 리 적 이다!setter 방식 은 처음에 Spring 에 추천 되 었 으 니 분명 일리 가 있 을 것 입 니 다.앞서 언급 한 setter 방식 처럼 클래스 를 나중에 재 설정 하거나 다시 주입 할 수 있 는 것 이 장점 중 하나 입 니 다.그 밖 에 의존 하 는 여러 가지 실현 방식 이 있다 면@Qualifier 를 사용 하여 구조 방법 에서 해당 하 는 이름 을 선택 하여 주입 할 수도 있 고 field 나 setter 방식 으로 주입 할 실현 을 수 동 으로 설정 할 수도 있 습 니 다.
    봄 DI 의존 주입 방식 과 차이 점 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 봄 DI 의존 주입 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기