개발자챈재
챈재의 개발로그
개발자챈재
전체 방문자
오늘
어제
  • 분류 전체보기 (10)
    • Spring (7)
      • Spring (6)
      • MyBatis (0)
      • Spring Boot (0)
      • Spring JPA (1)
      • Spring Batch (0)
    • Node.js (0)
    • Vue (0)
    • React (0)
    • DataBase (1)
      • Oracle (0)
      • H2 (0)
    • DevOps (0)
      • DevOps (0)
      • AWS (0)
      • Docker (0)
      • Kubernetes (0)
    • Git (0)
    • IDE (1)
      • Eclipse (1)
      • IntelliJ (0)
    • WEB (0)
      • JQuery (0)
      • HTML CSS (0)
    • Algorithm (0)
    • Design Pattern (1)
    • Computer Science (0)

블로그 메뉴

  • 홈
  • Github
  • Naver Blog

공지사항

인기 글

태그

  • ioc
  • property
  • 제어의역전
  • XML
  • DI
  • Annotation
  • Properties
  • autowired
  • Spring
  • 의존성주입
  • Resource
  • 의존성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자챈재

챈재의 개발로그

[Spring] @Autowired, @Resource, @Inject의 차이
Spring/Spring

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

2022. 4. 26. 16:03
반응형

  • 어노테이션을 통한 의존성 주입(DI)는 어떻게 할까?
  • @Resource, @Autowired, @Inject의 차이는 뭘까?

 

 

클래스간의 의존 관계를 주입할 때에는 주로 어노테이션 방식으로 의존성 주입을 하게 된다.

따라서 개발자가 가장 자주 사용하게 될 의존성 주입 방식은 어노테이션 방식의 의존성 주입이다.

 

의존성 주입에 관련된 어노테이션은 @Resource / @Autowired / @Inject가 있는데 차이는 뭘까?

 

 

@Resource

스프링이 관리하는 빈 이름(Bean Name)으로 객체를 찾아 해당 빈을 주입한다.

이름으로 빈을 찾지 못하면 타입을 기준으로 의존성 주입을 진행한다.

Setter, Field에 사용할 수 있지만 생성자에는 사용하지 못 한다.

인터페이스로 다형성을 적용한 구현체들 중 하나를 선택해야하는 경우에는 객체명을 명시해준다.

Java 9 이상에서는 사용할 수 없다.

 

 

Setter에 애너테이션

@Service
public class Ch13Service2 {
    @Resource
	public void setCh13BoardDao2(Ch13BoardDao2 ch13BoardDao2) {
		logger.info("실행");
		this.ch13BoardDao2 = ch13BoardDao2;
	}
    ...
}

Field에 애너테이션

@Service
public class Ch13Service2 {
	@Resource(name="ch13BoardDao4")
	private Ch13BoardDao2 ch13BoardDao2;

    ...
}

 

 

@Autowired

IOC Controller에서 빈을 찾을 때,  데이터 타입을 기준으로 객체를 찾고 주입된다

동일한 타입의 빈이 여러 개 존재할 경우에는 참조 변수의 이름과 동일한 빈을 찾아서 주입한다

생성자, Setter, Field에 사용할 수 있다. 즉, @Resource와는 달리 생성자에도 사용할 수 있다

@Qualifier 애너테이션을 사용해서 이름을 기준으로 의존성 주입할 빈을 지정 가능

동일한 타입의 빈이 여러 개 존재할 경우 @Primary 애너테이션을 빈 클래스에 적용하면 우선 주입될 빈을 지정 가능

 

​

생성자에 애너테이션

@Service
public class Ch13Service2 {
    @Autowired
	public Ch13Service2(Ch13BoardDao2 ch13BoardDao2) {
		logger.info("실행");
        this.ch13BoardDao2 = ch13BoardDao2;
	}
    ...
}

Setter에 애너테이션

@Service
public class Ch13Service2 {
    @Autowired
	public void setCh13BoardDao2(Ch13BoardDao2 ch13BoardDao2) {
		logger.info("실행");
		this.ch13BoardDao2 = ch13BoardDao2;
	}
    ...
}

Field에 애너테이션

@Service
public class Ch13Service2 {
	@Autowired
	private Ch13BoardDao2 ch13BoardDao2;

    ...
}

 

@Inject

@Inject 애너테이션은 @Autowired와 동일하게 사용할 수 있으며 서로 대체가 가능하다.

추가적으로 빈 이름으로 의존성을 주입할 때 @Named 애너테이션도 사용할 수 있다. 

@Autowired는 스프링에서만 지원하는 애너테이션으로 스프링 프레임워크에 종속적이지만 @Inject은 Java에서 지원하는 애너테이션으로 스프링에 종속적이지 않다.

또한, @Inject은 nullable하지 않기 때문에 무조건 빈을 주입받아야한다.

 

 

 

 


 

Rerference

  • [Spring] @Autowired, @Inject, @Resource 차이점 비교정리

 

 

 

반응형

'Spring > Spring' 카테고리의 다른 글

[Spring] Web Application Context 설정  (0) 2022.05.10
[Spring] properties 파일을 이용한 DI  (0) 2022.04.27
[Spring] XML을 이용한 DI  (0) 2022.04.26
[Spring] 의존성과 의존성 주입 (Dependency & Dependency Injection)  (0) 2022.04.26
[Spring] IoC 제어 방식 (Inversion of Control)  (0) 2022.04.25
    'Spring/Spring' 카테고리의 다른 글
    • [Spring] Web Application Context 설정
    • [Spring] properties 파일을 이용한 DI
    • [Spring] XML을 이용한 DI
    • [Spring] 의존성과 의존성 주입 (Dependency & Dependency Injection)
    개발자챈재
    개발자챈재
    공부한 내용을 기억하기 위해 기록하고 공유하고 있습니다.

    티스토리툴바