일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- APPEND_SLASH = FALSE
- 1188 음식 평론가
- 2643 java
- 원격 연결 포트 포워딩
- windows 원격 연결 설정
- 2661 java
- 18233 java
- 2961 도영이가 만든 맛있는 음식
- django The requested operation has failed!
- django 프로젝트 시작
- 18233 비트마스킹
- 14711 타일 뒤집기
- java di
- 14711 java
- django settings.py
- django httpd error
- The requested operation has failed!
- 1188 java
- 18233 러버덕
- django
- django windows 배포 에러
- windows apache wsgi 에러
- Problems occurred while performing provisioning operation
- 2661 좋은 수열
- 2961 java
- django apache deploy error
- 공유기 원격 설정
- django 웹 페이지
- apache pythonpath
- 2643 색종이 올려 놓기
라이브러리는 도서관 아닌가요
DI 3 - Annotation을 사용한 Spring 의존성 주입 @Autowired 본문
이전 포스트( https://verycrazy.tistory.com/38?category=1027221 )의 내용에서
어노테이션을 붙여 더욱 간결하게 DI를 진행해보자.
Java 상에서 @와 합쳐진 문자열을 Annotation이라고 한다.
여기서 사용할 어노테이션은 @Autowired이다.
기존에 java코드를 건드리지 않고 xml을 이용해서 DI를 진행했다.
하지만 이것은 java로 개발하는 것과 다소 거리가 느껴져,
이러한 설정을 java 코드 상에서 직관적으로 다룰 수 있도록
결국에는 java에 @Autowired라는 어노테이션을 가져온다.
그리고 이것이 Spring 개발의 트렌드다.
사용 방법을 살펴보자
설정자 메서드의 속성이 되는 객체에 @Autowired를 붙여놓고
기존 xml 파일에 존재하는 <property> 태그를 없앤다.
해당 property 태그가 의존성을 해결하는 녀석이니 말이다.
다시 말해 이제는 설정 옵션을 java에서 가져와 지시하겠다는 것이다.
Laptop.java 코드는 아래와 같다.
// myPackage.Laptop
import org.springframework.beans.factory.annotation.Autowired;
public class Laptop{
@Autowired
Keyboard keyboard;
public Keyboard getKeyboard(){
return keyboard;
}
// 아래의 코드가 없어진다. 놔둬도 상관은 없다.
// public void setKeyboard(Keyboard keyboard){
// this.keyboard = keyboard;
// }
public String showInputBrand(){
return "연결된 키보드= " + keyboard.getKeyboardBrand();
}
}
객체가 생성되는 저 부분 이외에도 setter 역할을 하는 메서드에 설정해주어도 된다.
Main.java는 그대로다.
package myPackage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("myPackage/setting.xml");
Laptop aLaptop = context.getBean("aLaptop", Laptop.class);
System.out.println(aLaptop.showInputBrand());
}
}
그 다음 xml 파일을 변경해야 한다만, 문제가 있다.
예전에는 setting.xml 설정 파일을 마우스로 우클릭 후
open with에서 spring config editor를 찾아 namespace를 지정해줄 수 있었지만,
새로운 spring tools 공개 이후 안되는 것 같다.
따라서 setting.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"
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"
xmlns:context="http://www.springframework.org/schema/context">
<context:annotation-config />
<!-- Keyboard 타입인 aKeyboard가 해당 경로에 존재하니 참조해라 -->
<bean id="aKeyboard" class="myPackage.KoreaKeyboard" />
<!-- Laptop 타입인 aLaptop이 해당 경로에 존재하니 참조해라 -->
<bean id="aLaptop" class="myPackage.Laptop">
<!-- Keyboard aKeyboard = new KoreaKeyboard(); -->
<!-- aLaptop.setKeyboard(aKeyboard); -->
<!-- <property name="keyboard" ref="aKeyboard"></property> -->
</bean>
</beans>
<property> 태그도 이제 필요 없어졌다.
흥미로운 점은 무엇을 근거로 부품 객체가 Autowired가 됐을까하는 것이다!
전에는 bean의 id를 property 태그에서 ref를 통해 바인딩했다. (이게 한글인가 영어인가...?)
올바르게 DI를 하려면 이 기준을 상세히 알아야 한다.
다음 포스트에서 이어가겠지만, 힌트를 남기자면 '타입'이다.
'Java > DI' 카테고리의 다른 글
DI 5 - @Resources @Autowired 차이 (0) | 2021.12.17 |
---|---|
DI 4 - @Qualifier("")를 사용해 @Autowired id 설정 (0) | 2021.12.17 |
DI 2 - xml 파일로 Spring DI 지시서 작성 (0) | 2021.12.14 |
DI 1 - 의존성 발생 지점은 new (0) | 2021.12.06 |