1 분 소요

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는 인터페이스이고, 여러 종류가 있다.

  1. ClassPathXmlApplicationContext
  2. FileSystemXmlApplicationContext
  3. XmlWebApplicationContext
  4. AnnotationConfigApplicationContext

- getBean하는 방법 두 가지

  • 이름 : context.getBean(“console”)로 가져오면 Object형으로 반환되므로 casting을 해야한다

  • 자료형 : context.getBean(ExamConsole.class)로 가져오면 casting이 필요없다

카테고리:

업데이트:

댓글남기기