일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 세션
- 자바스크립트
- JSP
- xml mapping
- 데이터베이스
- 웹프로그래밍
- 공문서작성규정
- 데이터규정
- JavaScript
- Request/Response Header
- HTTP
- Ajax
- 자바
- 스프링프레임워크
- java annotation
- Database
- java컴파일
- XML DOM
- 반응형웹
- Servlet
- 카카오APi
- 데이터포맷
- xml
- XML Core
- Java
- 프로그래밍용어
- 데이터문서포맷
- JSTL
- Multipart
- Session
- Today
- Total
KyungHwan's etc.
스프링(Spring)을 통한 의존성(DI) 주입 본문
1.XML을 통한 의존성 주입
expert.xml
<beans xmlns="<http://www.springframework.org/schema/beans>"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean **id="koreaTire"** class="expert003.KoreaTire"></bean>
<bean id="americaTire" class="expert003.AmericaTire"></bean>
<bean id="car" class="expert003.Car">
<property name="tire" ref="koreaTire"**></property>**
</bean>
</beans>
2. @Autowired 를 통한 속성주입
Car 라고 하는 클래스에 tire 라고 하는 속성을 만든다고 한다. 그럼 대부분 아래와 같은 코드를 만들게 된다.
Tire tire;
public Tire getTire() { return tire;
}
public void setTire(Tire tire) { this.tire = tire;
}
get /set 메서드를 꼭 만들어야 할까? Eclipse 의 Source > Generate Getters and Setters...메뉴를 사용하면 get/set 메서드를 아주 쉽게 만들어 주지만 Spring 개발팀은 더 창조적으로 어노테이션을 이용하는 방법을 사용하기 시작하여 아래와 같은 코드로 변경하였다.
import org.springframework.beans.factory.annotation.Autowired;
Tire tire;
변경된 Spring 설정파일(여기서는 expert.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-3.1.xsd">
<context:annotation-config />
<bean id="tire" class="expert004.KoreaTire"></bean>
<bean id="americaTire" class="expert004.AmericaTire"></bean>
<bean id="car" class="expert004.Car"></bean>
</beans>
빨간색 부분이 기존 Spring 설정 파일 대비 추가되는 부분이다.expert.xml 의 context menu 에서 Open With > Spring Config Editor 를 선택한다. 편집기가 열리면 하단의 Namespaces 탭을 클릭해 준다. 그 중에 context 를 체크해 주시면 위의 빨간줄 중에 위쪽의 3 줄이 자동으로 삽입된다. 그 후에 Source 탭으로 돌아와 <context:annotaion-config /> 만 입력하고 저장해 주시면 된다.
@Autowird는 Spring 설정 파일을 보고 자동으로 속성의 set 메서드에 해당하는 역할을 해주겠다는 의미이다. xml 파일에서 뭔가가 수정되었다.
기존 소스
<bean id="car" class="expert003.Car">
<property name="tire" ref="koreaTire"></property> </bean>
새로운 소스
<bean id="car" class="expert004.Car"></bean>
@Autowird 를 통해서 자동으로 car 의 property 를 찾아줄 수 있음으로 생략이 가능해 졌다.
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean id="tire" class="expert004.AmericaTire"></bean> |
그런데 아래와 같이 작성되어도 제대로 매핑이 된다.
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean class="expert004.AmericaTire"></bean> |
Spring 의 마법은 아래 코드에 있다.
Car.java | @Autowired Tire tire; |
---|---|
expert.xml | <bean class="expert004.AmericaTire"></bean> |
AmericaTire.java | public class AmericaTire implements Tire |
바로 interface 의 구현 여부 이다. Spring 의 마법은 type 기준 매핑이 먼저이고, 같은 type**을 구현한 여러 개의 클래스가 있다면 그 때 bean id 로 구분해서 매핑하게 된다.
그럼 여기서 하나의 실험을 더해 보자 아래는 정상 구동할까?
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean id="usaTire" class="expert004.AmericaTire"></bean> |
정상구동한다.
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean class="expert004.KoreaTire"></bean> <bean class="expert004.AmericaTire"></bean> |
역시 정상 구동한다. Spring 은 id 기준 매핑보다 type 매핑이 우선순위가 있기 때문에 정상 구동한다.
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean id="tire" class="expert004.KoreaTire"></bean> <bean class="expert004.AmericaTire"></bean> |
KoreaTire 로 잘 작동하는 걸 확인할 수 있다.
Car.java | expert.xml |
---|---|
@Autowired Tire tire; | <bean id="wheel" class="expert004.KoreaTire"></bean> |
역시 정상 구동한다. Spring 은 id 기준 매핑보다 type 매핑이 우선순위가 있기 때문에 정상 구동한다.
Reference
'Java > 스프링프레임워크' 카테고리의 다른 글
스프링프레임워크 - Spring Framework: annotation 정리 (0) | 2018.06.01 |
---|---|
스프링프레임워크 -Mybatis (0) | 2018.05.31 |
스프링프레임워크 용어 간단히 정리 (0) | 2018.05.31 |
어노테이션(Annotation) (0) | 2018.05.31 |
스프링프레임워크 - DAO, DTO ,VO (0) | 2018.05.30 |