spring DI 의존 주입 방식 과 차이 점
Spring 프레임 워 크 가 Java 개발 에 대한 중요성 은 두말 할 필요 도 없다.그 핵심 적 인 특성 은 IOC(Inversion of Control,반전 제어)와 AOP 이다.평소에 가장 많이 사용 하 는 것 이 바로 그 중의 IOC 이다.우 리 는 구성 요 소 를 Spring 의 IOC 용기 에 맡 겨 관리 함으로써 대상 의 의존 관 계 를 Spring 에 의 해 제어 하고 하 드 코딩 으로 인 한 과도 한 프로그램 결합 을 피한다.
3 가지 DI 주해 의 차이
1 @Autowired
사용 특성
a.@autoword 를 주 입 된 구성원 변수 에 쓰 면 xml 파일 에 설정 하지 않 고 프로그램 에서 해당 하 는 setter 와 getter 방법 을 제거 합 니 다.
b.구조 방법,setter 방법 에 도 쓸 수 있 습 니 다.
c、@Qualifier
@Qualifier("XXX")의 XX 는 Bean 의 이름 이기 때문에@Autowired 와@Qualifier 를 결합 하여 사용 할 때 자동 으로 주입 하 는 정책 이 by Type 에서 by Name 으로 바 뀌 었 습 니 다.
그러나 주의해 야 할 것 은@Autowired 는 구성원 변수,방법 및 구조 함 수 를 주석 할 수 있 고@Qualifier 의 레이 블 대상 은 구성원 변수,방법 입 참,구조 함수 입 참 입 니 다.
2 @Inject
사용 특성
a.@Inject 를 변수,setter 방법,구조 함수 에 사용 할 수 있 습 니 다.@Autowired 와 같 습 니 다.
b、@Named
@Named("XXX")의 XX 는 Bean 의 이름 이기 때문에@Inject 와@Named 를 결합 하여 사용 할 때 자동 으로 주 입 된 정책 이 by Type 에서 by Name 으로 바 뀌 었 습 니 다.
3 @Resource
사용 특성
a,@Resource 실례
3 가지 주입 방식 의 차이
주의 항
@Controller
public class FooController {
@Autowired
//@Inject
private FooService fooService;
// ,
public List<Foo> listFoo() {
return fooService.list();
}
}
이런 주입 방식 은 가장 흔히 볼 수 있 는 주입 방식 이 어야 한다.이 유 는 간단 하 다.
@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 을 사용 할 때 오류 가 발생 합 니 다.
총화
이 문제 에 대해 당신 의 클래스 에 너무 많은 책임 이 있다 는 것 을 설명 한다.그러면 당신 은 자신 이 클래스 의 단일 성 직책 원칙 을 위 반 했 는 지 잘 생각해 서 이렇게 많은 의존 을 주입 해 야 한다.
Q2:다른 주입 방식 은 모두 적합 하지 않 습 니까?
존재 가 합 리 적 이다!setter 방식 은 처음에 Spring 에 추천 되 었 으 니 분명 일리 가 있 을 것 입 니 다.앞서 언급 한 setter 방식 처럼 클래스 를 나중에 재 설정 하거나 다시 주입 할 수 있 는 것 이 장점 중 하나 입 니 다.그 밖 에 의존 하 는 여러 가지 실현 방식 이 있다 면@Qualifier 를 사용 하여 구조 방법 에서 해당 하 는 이름 을 선택 하여 주입 할 수도 있 고 field 나 setter 방식 으로 주입 할 실현 을 수 동 으로 설정 할 수도 있 습 니 다.
봄 DI 의존 주입 방식 과 차이 점 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 봄 DI 의존 주입 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.