본문 바로가기

Backend/Spring & SpringBoot

[Spring Framework] 02_02 의존객체 자동 주입

728x90

* 의존 객체 자동 주입이란?

스프링 설정 파일에서 의존 객체를 주입할 <constructor-arg> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다. 구현 방법은 @Autowired와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.

 

1) @Autowired
 타입을 기준으로 의존성을 주입,
 같은 타입 빈이 두 개 이상 있을 경우 변수이름으로 빈을 찾음  
 Spring 아노테이션

2) @Qualifier
 빈의 이름으로 의존성 주입  
 @Autowired와 같이 사용  
 Spring 아노테이션

3) @Resource
 name을 속성을 이용하여 빈의 이름을 직접 지정  
 JavaSE의 아노테이션(JDK9에는 포함 안 되어 있음)

4) @Inject
 @Autowired 아노테이션을 사용하는 것과 같다
 JavaSE의 아노테이션

 

자동주입

 

자동 주입을 하기 위해서는 xml 파일에 이 부분을 추가해준다. 

1)

xmlns:context="http://www.springframework.org/schema/context

 

2)

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.3.xsd

 

3) 

<context:annotation-config/>

이 세 부분을 추가 해준다. 

 

그렇다면 , 자동주입을 사용하는 방법에 대해 한번 살펴 보겠다.

 

#auto-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!-- 자동 스캔 명령 추가 -->
	<context:annotation-config/>
	<bean id ="paper1" class="com.spring.basic.ex04.Paper"/>
	<bean id ="paper2" class="com.spring.basic.ex04.Paper"/>
	<bean id="prt" class="com.spring.basic.ex04.Printer"/>
	<bean id="book" class="com.spring.basic.ex04.Book"/>
	
</beans>

#Paper.java

package com.spring.basic.ex04;

public class Paper {
	public String [] data = {
			"스프링 프레임워크",
			"자동 객체 주입",
			"Autowired는 객체의 타입을 겁색하여 자동으로 주입!"
	};
}

 

#Printer.java

package com.spring.basic.ex04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Printer {

	@Autowired
	@Qualifier("paper1")
	private Paper paper;
	
	public Paper getPaper() {
		return paper;
	}
	
	public Printer() {}
	
	public Printer(Paper paper) {
		this.paper= paper;
	}
	
	public void setPaper(Paper paper) {  //setter을 이용해 주입
		this.paper = paper;
	}
	public void showPaperInfo() {
		for(String info :paper.data) {
			System.out.println(info); 
		}
	}

}

=> 아노테이션을 그냥 멤버변수 앞에 붙이는것이 일반적이다. (생성자, setter에 앞에 붙여서 주입할 수 도 있음)

 

#Book.java

package com.spring.basic.ex04;

import javax.annotation.Resource;

public class Book {
	
	//@Autowired
	//@Qualifier("paper2")  이걸 하나로 합친거... @Resource
	
	@Resource(name="paper2")
	private Paper paper;
	
	public void setPaper(Paper paper) {
		this.paper = paper;
	}
	public Paper getPaper() {
		return paper;
	}
	
}

=> @Resource 는 생성자에서 사용이 불가능하다. 

 

#MainClass.java

package com.spring.basic.ex04;

import java.util.Arrays;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		
		GenericXmlApplicationContext ct = new GenericXmlApplicationContext("classpath:auto-config.xml");
		Printer printer = ct.getBean("prt", Printer.class);
		printer.showPaperInfo();
		
		System.out.println("===============================");
		System.out.println("# 책 내용 확인.");
		Book book = ct.getBean("book", Book.class);
		String datas = Arrays.toString(book.getPaper().data);
		System.out.println(datas);
		
		ct.close();
	}
}

 

<실행결과>

 

사용된 아노테이션의 특징. 
 # @Autowired
 - 객체를 자동 주입할 때 사용하는 아노테이션.
 - 스캔 명령을 통해 객체를 찾아 주입하는데, 타입 이름으로 검색
 - 만약 타입을 찾아내지 못하면 이름(id속성값)을 통해 검색
 - 생성자, 필드, 메서드에 적용 가능  
 - 필드에 자동 주입 설정을 할 때는 기본 생성자가 반드시 있어야함
 
 # @Qualifier("bean id")
 - Autowired를 사용할 때 동일 타입의 빈이 여러 개 있을 경우 , 

어떤 빈을 주입해야하는 지 선택해 주는 추가 아노테이션.
 
 # @Resource
 - 빈을 자동주입하는 아노테이션
 - 필드, 메서드에만 적용이 가능하며, 생성자에서는 사용 불가능
 - name속성을 통해 특정  bean의 id를 지목.
 - 사후 지원이 더이상 진행되고 있지 않다. (JDK9에는 포함 안 되어 있음)
 

728x90