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

SMI·2024년 12월 12일

@Autowired, @Resource, @Inject는 모두 Spring Framework에서 의존성 주입 (Dependency Injection, DI)을 위한 어노테이션입니다. 이 어노테이션들은 객체 간의 의존성을 자동으로 주입하기 위해 사용되며, 각각의 특징이 다릅니다.

@Autowired

타입 -> 이름 -> @Qualifier -> 실패

  • Spring의 기본 의존성 주입 어노테이션입니다. 때문에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 경우가 있다면 모두 수정해야 합니다.
  • 타입을 기준으로 의존성을 주입합니다.
  • 기본적으로 필드나 생성자에 사용되며, 주입할 대상이 없으면 예외가 발생합니다. 하지만 @Autowired(required = false)로 설정하면 주입하지 않아도 됩니다.
@Service
public class MyService {
    public void serve() {
        System.out.println("MyService is serving...");
    }
}

@Controller
public class MyController {
    // MyService 타입에 맞는 빈을 자동으로 주입
    @Autowired
    private MyService myService;
    
    public void execute() {
        myService.serve();
    }
}

@Resource

이름 -> 타입 -> @Qualifier -> 실패

  • 자바에서 지원하는 의존성 주입 어노테이션이며, 특정 프레임워크에 종속적이지 않습니다.
  • name속성의 이름을 기준으로 의존성을 주입할 객체를 찾습니다.
@Service("myService")  // 빈 이름을 명시적으로 설정
public class MyService {
    public void serve() {
        System.out.println("MyService is serving...");
    }
}
@Controller
public class MyController {

    // @Resource는 이름을 기준으로 의존성을 주입
    @Resource(name = "myService")  // "myService"라는 이름을 가진 빈을 찾아서 주입
    private MyService myService;

    public void execute() {
        myService.serve();
    }
}

@Inject

타입 -> @Qualifier -> 이름 -> 실패

  • 자바에서 지원하는 의존성 주입 어노테이션이며, 특정 프레임워크에 종속적이지 않습니다.
  • @Aurowired와 동일하게 작동하지만 찾는 순서가 다릅니다.
@Service
public class MyService {
    public void serve() {
        System.out.println("MyService is serving...");
    }
}
@Controller
public class MyController {

    // @Inject는 타입을 기준으로 의존성을 주입합니다.
    @Inject
    private MyService myService;

    public void execute() {
        myService.serve();
    }
}

Reference
https://velog.io/@sungmo738/
https://itjava.tistory.com/22

profile
끈기있게 파고드는 개발자가 되기 위해 노력하고 있습니다.

0개의 댓글