DI를 왜 쓰는가?
규모가 커진 프로젝트에 DI를 사용하여 객체간 결합도를 낮춰 유지보수를 원활하게 함.
위 예제는 인터페이스를 활용하여 스프링 설정파일(xml)만을 수정하고 Java파일을 건드리지 않으면서 수정했음.
DI 설정 1 - XML 사용
1-1. 생성자
<constructor-arg> 태그 사용
<bean id="student1" class="com.javalec.ex.Student"> <constructor-arg value="홍길동" />
1-2. setter
<property> 태그 사용
<bean id="student1" class="com.javalec.ex.Student"> <property name="height"> <value>187</value> </property>
1-3. 축약
c:field 혹은 p:field=""
이렇게 선언하면
<beans xmlns="http://www.springframework.org/schema/beans"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:c="http://www.springframework.org/schema/c"; xmlns:p="http://www.springframework.org/schema/p"; xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd";>
이렇게 줄여서 가능하다
<bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홈엄마" p:sisterName="홍누나"> <property name="brotherName" value="홍오빠" /> </bean>
DI 설정 2 - 자바 클래스파일 사용
package com.javalec.ex; import java.util.ArrayList; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //이걸 어노테이션이라고 해. @Configuration public class ApplicationConfig { @Bean public Student student1() { ArrayList<String> hobbys = new ArrayList<String>(); hobbys.add("수영"); hobbys.add("요리"); Student student = new Student("홍성은",28,hobbys); student.setWeight(68); student.setHeight(172); return student; } @Bean public Student student2() { ArrayList<String> hobbys = new ArrayList<String>(); hobbys.add("공부"); hobbys.add("독서"); Student student = new Student("홍성민",26,hobbys); student.setWeight(58); student.setHeight(168); return student; } }
public class MainClass { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class); Student student1 = ctx.getBean("student1", Student.class); System.out.println("이름 : " + student1.getName()); Student student2 = ctx.getBean("student2", Student.class); System.out.println("이름 : " + student2.getName()); ctx.close(); } }
DI 설정 3 - JAVA in 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd";> <context:annotation-config /> <bean class="com.javalec.ex.ApplicationConfig" /> <bean id="student2" class="com.javalec.ex.Student"> <constructor-arg value="홍길순"></constructor-arg> <constructor-arg value="30"></constructor-arg> <constructor-arg > <list> <value>마라톤</value> <value>요리</value> </list> </constructor-arg> <property name="height" value="190" /> <property name="weight" value="70" /> </bean> </beans>
public static void main(String[] args) { AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml"); Student student1 = ctx.getBean("student1", Student.class); System.out.println("이름 : " + student1.getName());
DI 설정 4 - XML in JAVA
@Configuration @ImportResource("classpath:applicationCTX.xml") public class ApplicationConfig { @Bean public Student student1(){ ArrayList<String> hobbys = new ArrayList<String>(); hobbys.add("수영"); hobbys.add("요리"); Student student = new Student("홍길동", 20, hobbys); student.setHeight(180); student.setWeight(80); return student; } }
public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class); Student student1 = ctx.getBean("student1", Student.class); System.out.println("이름 : " + student1.getName());