개발/1일1문제해결

[Spring] @Autowired, @Inject, @Resource 사용법 및 차이

Gamii 2021. 7. 19. 00:58
728x90

1. 개념

  @Resource @Inject @Autowired
범용 자바에서 지원 자바에서 지원 스프링 전용
위치 필드, setter메서드 필드, 생성자,
setter메서드, 일반 메서드
필드, 생성자,
setter 메서드
연결 방식 이름으로 연결 타입에 맞춰서 연결 타입에 맞춰서 연결
연결을 위한 검색 방식 이름->타입->@Qulifier
->실패
타입->@Qulifier->이름
->실패
타입->이름>@Qulifier
->실패
강제 연결 방식 @Resource(name="title") @Qualifier("title")  
공통점 자동 의존성 주입(DI)

 

2. 예시

1) @Resource

@Resource
private Apple banana;
//이름으로 연결하기 때문에 banana-> Banana로 연결 
//(이름의 맨 앞글자를 대문자로 변경해서 인식)

@Resource(name="banana")
private Apple bana;
//직접 이름을 명시해도 된다.

@Resource
@Qualifier("banana")
private Apple bana;
//Qualifier을 사용하여 명확하게 표현 가능

연결을 위한 검색 방식(순서)

  • name 속성에 지정된 Bean 객체를 검색 후 사용 (@Resource(name="banana"))    --- 이름
  • name 속성이 없을 경우, 동일한 타입을 갖는 Bean 객체를 검색 후 사용 (Apple)   --- 타입
  • name 속성이 없고, 동일 타입의 Bean 객체가 2개 이상인 경우
    • 같은 이름의  Bean 객체를 사용하거나,
    • 없다면, @Qualifier을 이용해서 객체를 검색 후 사용 (@Qualifier("banana"))   --- @Qualifier

 

 

2)@Inject

 

@Inject
private Apple ap;
//타입으로 연결하기 때문에 Apple을 찾아서 주입

 

3)@Autowired

@Autowired
private Banana banana;
//타입으로 연결하기 때문에, Banana로 연결

@Autowired
@Qualifier("banana")
private Banana bana;
//Qualifier로 Bean의 이름을 명시할 수 있다.

연결을 위한 검색 방식(순서)

  • 타입이 동일한 Bean 객체를 검색 후 사용(Banana)
    단, @Qulifier가 명시되어 있는 경우 @Qulifier와 같은 값을 가져야 한다.
  • 동일한 타입의 Bean 객체가 두개 이상인 경우
    • @Qulifier로 명시한 Bean을 사용
    • 없으면, 이름이 동일한 Bean 객체를 찾아서 사용(banana ->Banana)

 

  • 여러 Bean을 동시에 주입이 가능합니다.
    @Component
    public class Apple implements Fruits{
    }
    
    @Component
    public class Banana implements Fruits{
    }
    
    @Component
    public class Person{
    	@Autowired
        List<Fruits> fruits;
        //Fruits를 상속받는 Apple과 Banana가 주입이 되어있다.
    }​

 

  • @Autowired를 적용했지만, 스프링 Bean이 존재하지 않는 경우 Exception 발생
    --> Exception 발생시키지 않고, Null 값으로 유지 시키고 싶은 경우
    아래 코드처럼 @Autowired의 required 속성 값을 false로 지정
    @Autowired(required=false)
    private Apple apple;

 

 

  • @Autowired
    @Qualifier("banana")

    @Resource(name="banana")​
    둘 다 동일한 역할을 수행한다.