728x90
반응형

[Spring Framework] Spring Boot DI 완벽 정리 | @Resource 활용법

 

[Spring Framework] Spring Boot DI 완벽 정리 | @Resource 활용법

[Spring Framework] Spring Boot DI 핵심 가이드 | @Primary와 @Qualifier 제대로 이해하기 [Spring Framework] Spring Boot DI 핵심 가이드 | @Primary와 @Qualifier 제대로 이해하기[Spring Framework] Spring Framework 의존성 주입(DI)

crushed-taro.tistory.com

1. DI Annotation

1. @Inject

@Inject 어노테이션은 자바에서 제공하는 기본 어노테이션이다. @Autowired 어노테이션과 같이 Type으로 빈을 의존성 주입한다.

당 어노테이션은 사용하기 전 라이브러리 의존성 추가가 필요하므로 Maven Repository에서javax inject을 검색하여 build.gradle.kts파일에 아래와 같은 구문을 추가한다.

dependencies {
	implementation("javax.inject:javax.inject:1")
	...생략
}

 

1. 필드 주입

드로Pokemon 타입의 객체를 의존성 주입 받는 PokemonService 클래스를 선언한다. @Inject 어노테이션은 Type 으로 의존성 주입하므로 3개의 동일한 타입의 빈이 있는 현재 상황에서는 오류가 발생한다. 따라서 @Named어노테이션을 함께 사용해서 빈의 이름을 지정하면 해당 빈을 의존성 주입할 수 있다.

@Service("pokemonServiceInject")
public class PokemonService {

	/* 1. 필드 주입 */
	@Inject
	@Named("pikachu")
	private Pokemon pokemon;

	public void pokemonAttack() {
		pokemon.attack();
	}
}

CharmanderPikachuSquirtlePokemonService 를 빈 스캐닝 할 수 있는 basePackages를 설정하여 스프링 컨테이너를 생성한다.

ApplicationContext context = new AnnotationConfigApplicationContext("project");

PokemonService pokemonService = context.getBean("pokemonServiceInject", PokemonService.class);
		
pokemonService.pokemonAttack();

/*
피카츄 백만볼트⚡
*/

 

2. 생성자 주입

성자로Pokemon 타입의 객체를 의존성 주입 받는 PokemonService클래스를 선언한다.

@Service("pokemonServiceInject")
public class PokemonService {

	private Pokemon pokemon;

	/* 2. 생성자 주입 */
	@Inject
	public PokemonService(@Named("pikachu") Pokemon pokemon) {
		this.pokemon = pokemon;
	}

	public void pokemonAttack() {
		pokemon.attack();
	}
}

/*
피카츄 백만볼트⚡
*/

@Named어노테이션의 경우 메소드 레벨, 파라미터 레벨에서 둘 다 사용 가능하다.

 

3. 세터 주입

터로Pokemon타입의 객체를 의존성 주입 받는PokemonService클래스를 선언한다.

@Service("pokemonServiceInject")
public class PokemonService {

	private Pokemon pokemon;

	/* 3. 세터 주입 */
	@Inject
	public void setPokemon(@Named("pikachu") Pokemon pokemon) {
		this.pokemon = pokemon;
	}

	public void pokemonAttack() {
		pokemon.attack();
	}
}

/*
피카츄 백만볼트⚡
*/

@Inject는 필드 주입생성자 주입세터 주입모두 가능하다.

 

정리

DI는 스프링 프레임워크에서 매우 중요한 개념 중 하나로, 개발자는 객체 간의 의존성을 직접 관리하지 않고 스프링 컨테이너가 객체 간의 의존성을 주입해주는 방식으로 관리할 수 있다.

다양한 DI 어노테이션이 있는데 각각의 특징과 사용 방식이 다르다.

  @Autowried @Resource @Inject
제공 Spring Java Java
지원 방식 필드, 생성자, 세터 필드, 세터 필드, 생성자, 세터
빈 검색 우선 순위 타입 → 이름 이름 → 타입 타입 → 이름
빈 지정 문법 @Autowired
@Qualifier(”name”)
@Resource(name=”name”) @Inject
@Named(”name”)
728x90
반응형

+ Recent posts