* 의존 객체 자동 주입이란?
스프링 설정 파일에서 의존 객체를 주입할 때 <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에는 포함 안 되어 있음)
'Backend > Spring & SpringBoot' 카테고리의 다른 글
[Spring Framework] 03_01. Spring Framework 설계 모델 (0) | 2020.08.18 |
---|---|
[Spring Framework] 03. Spring 개발환경 구축 (0) | 2020.08.13 |
[Spring Framework] 02_01. Setter을 이용한 의존성 주입 방법 (0) | 2020.08.12 |
[Spring Framework] 02. DI(Dependency injection) (0) | 2020.08.11 |
[Spring Framework] 01. Spring과 maven의 이해 (0) | 2020.08.11 |