[Spring]DI 지시서
Spring
⭐Spring사용하지 않은 DI
package spring.di;
public class Program {
public static void main(String[] args) {
Exam exam = new NewlecExam(1,2,3,4);
ExamConsole console = new GridExamConsole();
console.setExam(exam); // DI
console.print();
}
}
>>>
┌─────────┬─────────┐
│ total │ avg │
├─────────┼─────────┤
│ 10 │ 2.50 │
└─────────┴─────────┘
spring을 사용하지 않고 exam
이라는 dependecy를 만들어서 console
에 injection한 후 print하는 코드이다.
exam이라는 객체가 바뀌거나 console이 바뀌는 경우 정적인 코드로 박아 놓은것 보다,
설정파일로 빼서 처리하는게 바람직하다 👉 Spring이 도와줌
⭐DI 지시서 작성
DI 지시서를 작성하면 부품을 생성하고 조립(setExam
)해서 반환해준다!
- 지시서(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">
<!--Exam exam = new NewlecExam(1,2,3,4); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<!-- exam.setKor(10) -->
<!-- exam.setEng(20) -->
<!-- exam.setMath(10) -->
<!-- exam.setCom(10) -->
<property name="kor" value="10"/>
<property name="eng" value="20"/>
<property name="math" value="10"/>
<property name="com" value="10"/>
</bean>
<!--ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
<!--console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
<bean />
태그를 이용해서 생성할 객체를 지시한다.
<bean id="변수명" class="패키지명(중복을 피하기 위해서) + 객체화 할 클래스명" />
injection지시 두 가지 방법
1.setter injection
<property name="" ref="" 또는 value="">
를 사용하여 setter를 이용한 injection을 지시할 수 있다.
이때<property>
태그 안 name은console.setExam(exam)
의 setExam에서 set을 지우고 Exam의 E를 소문자로 바꾼exam
으로 작성해야 한다.(규칙)
2.생성자 injection
<constructor-arg index="" value="" />
를 사용하여 생성자를 이용한 injection을 지시할 수 있다.<!--Exam exam = new NewlecExam(10,20,40,30); --> <bean id="exam" class="spring.di.entity.NewlecExam"> <constructor-arg index="0" type="int" value="10" /> <constructor-arg index="1" type="int" value="20" /> <constructor-arg index="com" type="int" value="30" /> <constructor-arg index="math" type="int" value="40" /> </bean>
- 설정 파일 처리기를 setting.xml에 추가(namespace에서 p를 추가)하면 좀 더 쉽게 할 수 있다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
</beans>
⭐Spring사용한 DI
package spring.di;
import org.springframework.context.ApplicationContext;
...
public class Program {
public static void main(String[] args) {
ApplicationContext context
= new ClassPathXmlApplicationContext("spring/di/setting.xml");
//ExamConsole console = (ExamConsole) context.getBean("console");
ExamConsole console = context.getBean(ExamConsole.class);
console.print();
}
}
ApplicationContext (maven project로 바꿔서 pom.xml에 dependency를 추가한 후 import해야 한다) 를 이용하여 작성한 지시서를 읽어올 수 있다.
ApplicationContext는 인터페이스이고, 여러 종류가 있다.
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
- AnnotationConfigApplicationContext
- getBean하는 방법 두 가지
-
이름 : context.getBean(“console”)로 가져오면 Object형으로 반환되므로 casting을 해야한다
-
자료형 : context.getBean(ExamConsole.class)로 가져오면 casting이 필요없다
댓글남기기