결론부터 보자면 모두 DI를 위한 어노테이션이며,
동작순서의 차이와 자바 진영에서 지원하는건지 스프링에서 지원하는건지에 대한 차이가 있다.
(물론 DI가될 객체를 어떤 기준으로 찾는지 또한 조금씩 다르다)
- Sample Code
@Autowired // 타입 기준
private Wolf dog; // Wolf 타입으로 연결
@Resource // 이름 기준
private Wolf cat; // Cat 타입으로 연결
@Inject // 타입 기준
private Wolf rabbit; // Wolf 타입으로 연결
@Autowired
- Bean 타입을 통해서 주입할 Bean 객체를 찾는다. 만약 타입으로 연결이 안된다면 이름을 통해 찾는다.
- Field, Method, Constructor 에 사용할 수 있다.
- Spring Framework 에서만 지원하는 Dependency 용도 Annotation 이다. 만약 다른 Framework에서 자바코드를 사용하고자 한다면 자바에서 사용하는 @Resource, @Inject를 사용해야 한다. (물론 그럴 일은 아마 없을거다....)
@Autowired(required = false) // 예외처리 여부
@Qualifier("Howl") // 안에 문자열과 일치하는 객체로 강제 지정
private Wolf dog;
@Inject와 거의 유사하다. 그 이유는 자바에서 @AutoWired를 참고해서 만들었다고 한다 (ㄴㅇㄱ)
Bean 객체를 강제로 지정하기 위해서는 @Qualifier 어노테이션을 사용하면 된다.
또한 연결하고자 하는 Bean객체가 없을 경우 @Autowired는 예외를 Throw하게 되는데 이때 required = false로
지정해주면 예외를 발생하지 않는다. 물론 null값으로 존재할때의 처리를 별도로 해줘야 한다.
@Inject
- 자바에서 스프링의 @Autowired를 참고해서 만든 어노테이션. 그렇기에 매우 비슷하다.
- 당연히 자바에서 만들었기에 특정 프레임워크에 종속적이지 않다.
- Autowired와 동일하게 Bean 타입을 기준으로 찾는다. 만약에 없다면 이름으로 찾는다. 그런데도 없다면? 예외를 던져버린다;
- 멤버변수, Constructor, Method 에 사용 가능하다.
- Gradle, Maven에 javax 라이브러리를 추가해줘야 한다.
- 제일 권장되는 방식 중 하나라고 한다. (추후에 프레임워크가 바뀔 경우를 대비하기 위해 종속적이지 않은 @Inject가 선호도가 높다)
@Inject
@Qualifier("Meow") // Wolf가 없을경우 Meow를 연결한다. 그래도 없으면? 옛다 Exception ^^
private Wolf rabbit;
@Inject와 @Autowired의 차이점은?
일단 Bean을 찾는 순서가 쬐금 다르다.
@Autowired = 타입 -> 이름 -> @Qualifier -> 예외
@Inject = 타입 -> @Qualifier -> 이름 -> 예외
@Resource
- 이것또한 자바에서 만든거다. 특정 프레임워크에 종속적이지 않다.
- @Inject, @Autowired와 다르게 타입이 아닌 이름을 기준으로 연결한다.
- 멤버변수, Setter Method 에서 사용이 가능하다.
- @Inject와 동일하게 Gradle, Maven에 javax 라이브러리를 추가해야 한다.
- 일반적으로 name = "" 을 통하여 이름을 직접 지정하여 연결한다.
@Resource(name = "Meow") // 이와 같이 지정하면 cat이 아닌, Meow이름을 찾아 연결한다.
private Wolf cat;
유일하게 이름을 기준으로 먼저 찾는다.
@Autowired = 타입 -> 이름 -> @Qualifier -> 예외
@Inject = 타입 -> @Qualifier -> 이름 -> 예외
@Resource = 이름-> 타입 -> @Qualifier -> 예외
오늘도 슬기로운 코딩 생활.....잘못 기재되있는 사실이나, 궁금하신건 언제든지 댓글로 달아주세요 !
'Spring & Spring Boot' 카테고리의 다른 글
[Spring] JPA의 기본 CRUD를 사용해보자 ! (0) | 2023.03.14 |
---|---|
[Spring] Mybatis와 JPA의 차이점 feat. ORM이란? (0) | 2023.03.12 |
Spring JPA? Java Presistence API 가 뭘까요 ! (0) | 2023.02.01 |
Spring AND Spring Boot ? (0) | 2023.01.17 |
Spring Boot And Mybatis 연동하기 feat.MySQL (0) | 2023.01.17 |