본문 바로가기

프레임워크/Spring

[ Spring ] @Autowired, @Resource,@Inject 차이점

728x90

사용 예1

@Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션이지만 조금씩 차이가 있다.

 

 @Resource

@Autowired 

@Inject

 설명

 Java 에서 지원

  Spring Framework 에서 지원하는 Dependency 정의 용도의 어노테이션 자동주입이며 종속적이다

 Java 에서 지원

사용하는 위치

 필드 , 한개의 파라미터인 빈 프로퍼티 setter 메소드

필드 , 생성자 , 여러개인 파라미터 메소드 

필드 , 생성자 , 메소드

연결 또는 검색 방식 

 이름으로 연결 안되면 타입

타입으로 연결 안되면 이름 

타입으로 연결 안되면 이름 

특이사항 

 

 스프링프레임워크 종속

 

강제 연결 하기

 @Resource(name="title")

 @Qualifier("title")

 

@Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션이다. 반면 @Autowired의 경우에는 스프링에서 등장한 어노테이션이다. 따라서 스프링 이외에서는 사용 할 수 없다. 만약에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 경우가 있다면 @Autowired보단 @Inject나 @Resource를 써야한다. 다만 이런 경우는 거의 없다.

연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결한다.

 

@Resource

name 으로 DI 를 가능케한다. 자바에서 지원하는 어노테이션 이며 프레임워크에 종속적이지 않아 많이 사용한다. 이걸 추천한다. 다 똑같지만 필요로 하는 자원을 쓰기 위해 어노테이션을 추가해 DI를 한다. Bean을 생성해주며 싱글톤 패턴이 자동으로 적용이 된다고 생각하면 된다.

 

@Autowired

type으로 DI 를 가능케한다. 스프링 프레임워크에서 지원 하는 어노테이션이면 프레임워크에 종속적이다. 그래서 추천하지는 않는다 왜냐하면 스프링 프레임워크를 쓰다 다른 프레임워크로 수정할 경우에 많은 리소스가 발생한다. 다 바꿔줘야한다. 이것또한 Bean를 생성하며 싱글톤 패턴이 자동으로 적용이 된다. 타입으로 연결 하기 때문에 같은 타입인 여러개의 필드는 오류가 날것이다. 강제 연결 할경우에는 네임을 붙히고 @Qualifier를 사용한다.

 

@Inject

name으로 DI를 가능케한다. 자바에서 지원하는 어노테이션 이며 프레임 워크에 종속적이지 않아 사용해도 좋다. 이것은 @Resource 랑 다를게 없지만 다른점이라하면 자바에서 지원하는건데 타입으로 연결한다는 점이다 @Autowired 를 사용할거라면 차라리 Inject를 사용하는 걸 추천하는 편이기는 한다. 다만 오토와이어는 확실한 의존성이 보장된다.

@Resource
private Member member;
 
@Autowired
private Member member;
 
@Inject
private Member member;

//오토와이어 강제 연결
@Autowired
@Qualifier("member1")
private Member member

Resource는 이름으로 연결 하기 때문에 member으로 연결한다는 점이다

Autowired , Inject는 타입으로 연결하기 때문에 Member 로 연결한다

 

이걸 생각하며 자유롭게 사용 해야한다

@Autowired private Car hi;

@Autowired private Car car;

 

   관련 글

 

저의 글을 읽어 주셔서 감사합니다. 오늘도 즐거운 하루 보내세요.

저의 글이 조금이나마 도움이 되셨다면 로그인이 필요 없는 공감♥ 한번 꾸욱 눌러주세요 하하~

728x90