1. DI(Dependency Injection) 란?
- 스프링 IoC 컨테이너 핵심 개념 중 하나
- 다양한 프레임워크에 이미 적용되어 있는 기능
- 객체 간의 의존 관계를 외부의 조립기가 관리
- 불필요한 의존 관계를 없애거나 줄일 수 있음
- 단위테스트 수행 수월
- 설정파일과 애노테이션을 이용하여 객체 간의 의존 관계를 설정
- 각 객체를 빈(bean)으로 관리
* 1번째 기본 어플리케이션 의존 관계 - 코드에 직접 의존 클래스를 생성하는 문제와 수정해야하는 경우 코드를 수정해야 하는 범위가 넓어진다.
package di1.com.tistory.gangzzang; public class Hello { public static void main(String[] args) { MessageBean bean = new MessageBean(); bean.say("Spring"); } // main } // Hello
package di1.com.tistory.gangzzang; public class MessageBean { public void say(String name) { System.out.println("Hello, " + name + " !"); } // say } // MessageBean
* 2번째 인터페이스를 이용한 어플리케이션 의존 관계 - 코드를 수정해야 하는 범위가 적어질 수는 있지만 코드에서 직접 의존하는 객체를 생성하는 문제점이 있다.
package di2.com.tistory.gangzzang; public interface MessageBean { public void say(String name); } // MessageBean
package di2.com.tistory.gangzzang; public class Hello { public static void main(String[] args) { MessageBeanEn bean = new MessageBeanEn(); bean.say("Spring"); MessageBeanKo bean2 = new MessageBeanKo(); bean2.say("스프링"); } // main } // Hello
package di2.com.tistory.gangzzang; public class MessageBeanEn implements MessageBean { @Override public void say(String name) { System.out.println("Hello, " + name + " !"); } // say } // MessageBeanEn
package di2.com.tistory.gangzzang; public class MessageBeanKo implements MessageBean { @Override public void say(String name) { System.out.println("안녕하세요, " + name + " !"); } // say } // MessageBeanKo
* 스프링을 이용한 어플리케이션 의존 관계 - 객체 생성을 스프링 설정파일(xml, 애노테이션)에서 객체 생성과 의존 관계를 설정한다.
package di3.com.tistory.gangzzang.copy; public interface MessageBean { public void say(String name); } // MessageBean
package di3.com.tistory.gangzzang.copy; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class Hello { public static void main(String[] args) { Resource resource = new ClassPathResource("beans.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); MessageBeanEn bean = (MessageBeanEn) beanFactory.getBean("messageBeanEn"); bean.say("Spring"); MessageBeanKo bean2 = (MessageBeanKo) beanFactory.getBean("messageBeanKo"); bean2.say("스프링"); } // main } // Hello
2. 빈(Bean) 생성과 의존 관계 설정
- 컨테이너와 저장될 빈 객체와 각 빈 객체간이 연관관계는 XML 파일이나 애노테이션을 통해서 설정
2.1. 빈 객체 설정 및 컨테이너를 통한 빈 객체 사용
- 스프링 IoC 컨테이너가 관리할 빈 객체를 생성하기 위해서는 <bean> 태그를 사용
- <bean> 태그의 class 속성은 생성할 빈 객체의 완전한 클래스 이름
- <bean> 태그의 id 속성 혹은 name 속성에 빈 객체 식별 값 이름, getBean() 메서드에 전달
- getBean() 메서드의 리턴 타입은 Object이기 떄문에 형 변환이 필요, 3.0부터는 제네릭을 이용한 메서드 제공
- 생성자와 관련된 정보<constructor-arg> 태그를 명시하지 않았다면, 인자가 없는 기본 생성자로 객체를 생성
- static 메서드를 이용하여 객체를 구해야하는 클래스의 경우, <bean> 태그에 factory-method 속성 값으로 static 메서드를 지정
2.2. 의존 관계 설정
- 객체 간의 의존 관계도 XML 파일을 통해 명시
- 생성자, 프로퍼티 설정, 룩업 메서드 인젝션 세가지 방식으로 지정
2.2.1. 생성자 방식
- 의존하는 객체를 생성자를 통해서 전달
- <constructor-arg> 태그를 이용하여 의존 객체 전달
- <ref> 태그 또는 <constructor-arg> 태그의 ref 속성으로 빈 객체를 전달
- <value> 태그 또는 <constructor-arg> 태그의 value 속성으로 기본 데이터 타입이나 String 타입 값을 전달
- 파라미터가 2개 이상인 경우 파라미터 개수만큼 <constructor-arg> 태그를 설정
- 개수가 같은 파라미터일 경우 <value> 태그의 type 속성 또는 <constructor-arg> 태그의 type 속성으로 타입을 명시
2.2.2. 프로퍼티 설정 방식
- <property> 태그를 이용하여 값을 전달
- <ref> 태그를 이용하여 객체를 전달
2.2.3. XML 네임스페이스를 이용한 프로퍼티 설정
- XML 네임스페이스를 이용하면 <property> 태그 대신 간단한 방법으로 설정 가능
- p:프로퍼티이름 형식을 사용할 경우 이름이 Ref로 끝나는 프로퍼티에 대해서는 설정할 수 없음
// MemberDAO.java package com.tistory.gangzzang.injection; public class MemberDAO { private static MemberDAO instance = new MemberDAO(); public static MemberDAO getInstance() { return instance; } private MemberDAO() { } public void insert() { System.out.println("회원 가입 완료~~~~~~~"); } } // MemberDAO
// MemberDTO.java package com.tistory.gangzzang.injection; public class MemberDTO { private String id; private String pwd; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "MemberDTO [id=" + id + ", pwd=" + pwd + "]"; } } // MemberDTO
// MemberService.java package com.tistory.gangzzang.injection; public class MemberService { private MemberDAO memberDAO; public MemberService() { super(); } public MemberService(MemberDAO memberDAO) { super(); this.memberDAO = memberDAO; } public void insert() { memberDAO.insert(); } } // MemberService
// MemberTest.java package com.tistory.gangzzang.injection; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MemberTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/injection/beans.xml"); MemberDTO memberDTO = (MemberDTO) context.getBean("memberDTO"); System.out.println(memberDTO.toString()); MemberDTO memberDTO2 = (MemberDTO) context.getBean("memberDTO2"); System.out.println(memberDTO2.toString()); MemberService memberService = (MemberService) context.getBean("memberService"); memberService.insert(); } // main } // MemberTest /* * 실행결과 * * MemberDTO [id=Gz, pwd=1234] * MemberDTO [id=Gz2, pwd=12345] * 회원 가입 완료~~~~~~~ */
2.2.4. 룩업 메서드 인젝션 방식
- 필요한 객체를 제공하는 룩업(look up) 메서드를 구현하는 방식
- <lookup-method> 태그를 사용, name 속성은 룩업 메서드의 이름 bean 속성은 룩업 메서드가 리턴할 빈 객체 식별값
- 룩업 메서드 규칙
- 접근 수식어는 public이나 protected, 리턴 타입은 void이면 안됨, 인자를 가질 수 없음, 추상 메서드 가능, final이면 안됨
2.2.5. 임의 빈 객체 전달
- 식별값을 갖지 않는 빈객체를 생성해서 전달
- <constructor-arg> 태그나 <property> 태그안에 <bean> 태그를 중첩 사용
2.3. 컬렉션 타입 프로퍼티 설정
- 프로퍼티 타입이 컬렉션 타입인 경우 컬렉션 타입을 입력 받기 위한 스프링 태그
태그 |
컬렉션 타입 |
설명 |
<list> |
java.util.List, 배열 |
List 타입이나 배열에 값 목록을 전달할 때 사용 |
<map> |
java.util.Map |
Map 타입에 <키, 값> 목록을 전달 할 때 사용 |
<set> |
java.util.Set |
Set 타입에 값 목록을 전달 할 때 사용 |
<props> |
java.util.Properties |
Properties 타입에<프로퍼티이름, 프로퍼티값> 목록을 전달 할 때 사용 |
2.3.1. List 타입, 배열
- <ref> 태그는 객체, <bean> 태그는 식별값을 갖지 않는 임의 객체, <value> 태그는 래퍼 타입 또는 String 타입 값 (단, 타입을 명시)
- 제네릭(generic) 을 명시할 경우 <value> 태그의 타입을 명시하지 않아도 타입이 변환 됨
- <list>, <map>, <props>, <set> 컬렉션 객체
- <null> null 래퍼런스를 값으로 사용
2.3.2. Map 타입
- <entry> 태그는 Map에 저장될 한개의 <키, 값>을 표현
- <entry> 태그 속성의 <key>, <value>, <key-ref>, <value-ref>, <key-type>, <value-type> 속성을 이용하여 지정
2.3.3. Properties 타입
- 특별한 타입의 Map, 키와 값이 모두 String
- <props> 태그를 이용하여 프로퍼티를 설정
- <prop> 태그는 한개의 프로퍼티를 표현
2.3.4. Set 타입
- List와 같은 방법으로 값을 지정
// ListTest.java package com.tistory.gangzzang.collection; import java.util.List; public class ListTest { private List list1; private List<Double> list2; public void setList1(List list1) { this.list1 = list1; } public void setList2(List<Double> list2) { this.list2 = list2; } @Override public String toString() { return "ListTest [list1=" + list1 + ", list2=" + list2 + "]"; } } // ListTest
// MapTest.java package com.tistory.gangzzang.collection; import java.util.Map; public class MapTest { private Map map1; private Map<String, memberDTO> map2; public void setMap1(Map map1) { this.map1 = map1; } public void setMap2(Map<String, memberDTO> map2) { this.map2 = map2; } @Override public String toString() { return "MapTest [map1=" + map1 + ", map2=" + map2 + "]"; } } // MapTest
// PropertiesTest.java package com.tistory.gangzzang.collection; import java.util.Properties; public class PropertiesTest { private Properties properties; public void setProperties(Properties properties) { this.properties = properties; } public void connect() { String serverIP = properties.getProperty("server"); System.out.println("serverIP : " + serverIP); } @Override public String toString() { return "PropertiesTest [properties=" + properties + "]"; } } // PropertiesTest
// SetTest.java package com.tistory.gangzzang.collection; import java.util.Set; public class SetTest { private Set set1; private Set<Double> set2; public void setSet1(Set set1) { this.set1 = set1; } public void setSet2(Set<Double> set2) { this.set2 = set2; } @Override public String toString() { return "SetTest [set1=" + set1 + ", set2=" + set2 + "]"; } } // SetTest
0.6 2.4 192.168.0.1 5000 1.0 셋 0.6 2.4
// MainTest.java package com.tistory.gangzzang.collection; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/collection/beans.xml"); ListTest listTest = (ListTest) context.getBean("listTest"); System.out.println(listTest.toString()); MapTest mapTest = (MapTest) context.getBean("mapTest"); System.out.println(mapTest.toString()); PropertiesTest propertiesTest = (PropertiesTest) context.getBean("propertiesTest"); System.out.println(propertiesTest.toString()); propertiesTest.connect(); SetTest setTest = (SetTest) context.getBean("setTest"); System.out.println(setTest.toString()); } // main } // MainTest /* * 실행결과 * * ListTest [list1=[com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3, com.tistory.gangzzang.collection.MemberDAO@1bf7857f, 1.0, 리스트], list2=[0.6, 2.4]] * MapTest [map1={key=value, member=com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3}, map2={member=com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3}] * PropertiesTest [properties={connectionTimeout=5000, server=192.168.0.1}] * serverIP : 192.168.0.1 * SetTest [set1=[com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3, com.tistory.gangzzang.collection.MemberDAO@1bf7857f, 1.0, 셋], set2=[0.6, 2.4]] */
2.4. 의존 관계 자동 설정
- 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정
- byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정
- byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정
- constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달
- autodetect : constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정
- 위 4가지의 방식 중 특정방식을 <bean> 태그의 autowire 속성의 값에 지정, 기본 값은 default (default는 default-autowire 속성의 값을 사용한다는 것)
- 설정 파일에 포함된 모든 빈 객체에 자동 설정을 적용은 <beans> 태그의 default-autowire 속성의 값에 지정, 기본 값은 no (no는 자동설정을 사용하지 않는 것)
2.4.1. 프로퍼티 이름 의존 관계 자동 설정
- 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정
2.4.2. 프로퍼티 타입 의존 관계 자동 설정
- 프로퍼티 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정
- 동일한 타입의 빈객체를 한개만 설정할 수 있음
2.4.3. 생성자 파라미터 타입 의존 관계 자동 설정
- 생성자 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정
- 동일한 타입의 빈객체를 한개만 설정할 수 있음
2.4.4. 자동설정과 직접설정의 혼합
- 자동 설정과 함께 프로퍼티 중 일부는 자동 설정을 하지 않고 직접적으로 명시하여 빈 객체를 프로퍼티 값으로 설정
- 자동 설정에 의해 초기화 되지 않도록 하려면 <null> 태그를 이용하여 프로퍼티의 값을 null로 설정
// MainTest.java package com.tistory.gangzzang.autoinjection; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/autoinjection/beans.xml"); NameAutowire nameAutowire = (NameAutowire) context.getBean("nameAutowire"); System.out.println(nameAutowire.toString()); System.out.println("getBoardDTO, getNo : " + nameAutowire.getBoardDTO().getNo()); System.out.println("getBoardDTO, getPwd : " + nameAutowire.getBoardDTO().getPwd()); System.out.println("getBoardDTO, getWriter : " + nameAutowire.getBoardDTO().getWriter()); System.out.println("getMemberDTO, getId : " + nameAutowire.getMemberDTO().getId()); System.out.println("getMemberDTO, getPwd : " + nameAutowire.getMemberDTO().getPwd()); System.out.println("------------------------------------------------------------------------------------"); TypeAutowire typeAutowire = (TypeAutowire) context.getBean("typeAutowire"); System.out.println(typeAutowire.toString()); System.out.println("------------------------------------------------------------------------------------"); ConstructorAutowire constructorAutowire = (ConstructorAutowire) context.getBean("constructorAutowire"); System.out.println(constructorAutowire.toString()); System.out.println("getCarDTO, getCar_name : " + constructorAutowire.getCarDTO().getCar_name()); System.out.println("getCarDTO, getCar_price : " + constructorAutowire.getCarDTO().getCar_price()); System.out.println("------------------------------------------------------------------------------------"); MixAutowire mixAutowire = (MixAutowire) context.getBean("mixAutowire"); System.out.println(mixAutowire.toString()); System.out.println("getPhone_shop : " + mixAutowire.getPhone_shop()); System.out.println("getPhoneDTO, getPhone_name : " + mixAutowire.getPhoneDTO().getPhone_name()); System.out.println("getPhoneDTO, getPhone_price : " + mixAutowire.getPhoneDTO().getPhone_price()); } // main } // MainTest /* * 실행결과 * * NameAutowire [boardDTO=com.tistory.gangzzang.autoinjection.BoardDTO@4a2ff5a5, memberDTO=com.tistory.gangzzang.autoinjection.MemberDTO@12a849b0] * getBoardDTO, getNo : 1 * getBoardDTO, getPwd : 1234 * getBoardDTO, getWriter : Gz * getMemberDTO, getId : Gz * getMemberDTO, getPwd : 1234 * ------------------------------------------------------------------------------------ * 안녕하세요 * TypeAutowire [message=com.tistory.gangzzang.autoinjection.MessageKo@667dcb61] * ------------------------------------------------------------------------------------ * ConstructorAutowire [carDTO=com.tistory.gangzzang.autoinjection.CarDTO@4cb381d8] * getCarDTO, getCar_name : 부릉 * getCarDTO, getCar_price : 1029321 * ------------------------------------------------------------------------------------ * MixAutowire [phone_shop=신촌점, phoneDTO=com.tistory.gangzzang.autoinjection.PhoneDTO@1d11b33f] * getPhone_shop : 신촌점 * getPhoneDTO, getPhone_name : iphone * getPhoneDTO, getPhone_price : 893200 */
// BoardDTO.java package com.tistory.gangzzang.autoinjection; public class BoardDTO { private int no; private String writer; private String pwd; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getWriter() { return writer; } public void setWriter(String writer) { this.writer = writer; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } // BoardDTO
// memberDTO.java package com.tistory.gangzzang.autoinjection; public class MemberDTO { private String id; private String pwd; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } // MemberDTO
// NameAutowire.java package com.tistory.gangzzang.autoinjection; public class NameAutowire { private BoardDTO boardDTO; private MemberDTO memberDTO; public BoardDTO getBoardDTO() { return boardDTO; } public void setBoardDTO(BoardDTO boardDTO) { this.boardDTO = boardDTO; } public MemberDTO getMemberDTO() { return memberDTO; } public void setMemberDTO(MemberDTO memberDTO) { this.memberDTO = memberDTO; } @Override public String toString() { return "NameAutowire [boardDTO=" + boardDTO + ", memberDTO=" + memberDTO + "]"; } } // NameAutowire
// Message.java package com.tistory.gangzzang.autoinjection; public interface Message { public void message(); } // Message
package com.tistory.gangzzang.autoinjection; public class MessageEn implements Message { @Override public void message() { System.out.println("Hi"); } // message } // Message
package com.tistory.gangzzang.autoinjection; public class MessageKo implements Message { @Override public void message() { System.out.println("안녕하세요"); } // message } // Message
// TypeAutowire.java package com.tistory.gangzzang.autoinjection; public class TypeAutowire { private Message message; public Message getMessage() { return message; } public void setMessage(Message message) { this.message = message; } @Override public String toString() { message.message(); return "TypeAutowire [message=" + message + "]"; } } // TypeAutowire
// CarDTO.java package com.tistory.gangzzang.autoinjection; public class CarDTO { private String car_name; private int car_price; public String getCar_name() { return car_name; } public void setCar_name(String car_name) { this.car_name = car_name; } public int getCar_price() { return car_price; } public void setCar_price(int car_price) { this.car_price = car_price; } } // CarDTO
// ConstructorAutowire.java package com.tistory.gangzzang.autoinjection; public class ConstructorAutowire { private CarDTO carDTO; public ConstructorAutowire(CarDTO carDTO) { super(); this.carDTO = carDTO; } public CarDTO getCarDTO() { return carDTO; } @Override public String toString() { return "ConstructorAutowire [carDTO=" + carDTO + "]"; } } // ConstructorAutowire
// phoneDTO.java package com.tistory.gangzzang.autoinjection; public class PhoneDTO { private String phone_name; private int phone_price; public String getPhone_name() { return phone_name; } public void setPhone_name(String phone_name) { this.phone_name = phone_name; } public int getPhone_price() { return phone_price; } public void setPhone_price(int phone_price) { this.phone_price = phone_price; } } // PhoneDTO
// MixAutowire.java package com.tistory.gangzzang.autoinjection; public class MixAutowire { private String phone_shop; private PhoneDTO phoneDTO; public String getPhone_shop() { return phone_shop; } public void setPhone_shop(String phone_shop) { this.phone_shop = phone_shop; } public PhoneDTO getPhoneDTO() { return phoneDTO; } public void setPhoneDTO(PhoneDTO phoneDTO) { this.phoneDTO = phoneDTO; } @Override public String toString() { return "MixAutowire [phone_shop=" + phone_shop + ", phoneDTO=" + phoneDTO + "]"; } } // AutoDetectAutowire
2.5 부모 빈 설정 재사용
- <bean> 태그의 설정 정보가 중복되는 경우 부모 빈(parent bean)을 정의, 부모 빈 정보를 재사용
- <bean> 태그의 abstract 속성의 값을 ture 지정되면 빈 객체를 생성하지 않고 설정 정보만 존재
- <bean> 태그의 parent 속성의 값을 abstract 속성이 지정된 빈 객체의 식별값을 지정
- 부모 설정에서 변경 할 값이 있다면 추가로 입력
- 프로퍼티 뿐만 아니라 클래스도 새롭게 지정 가능
// ParentTest.java package com.tistory.gangzzang.parent; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ParentTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/parent/beans.xml"); PhoneDTO phoneDTO_apple1 = (PhoneDTO) context.getBean("phoneDTO_apple1"); System.out.println("phoneDTO_apple1, getManufacturer : " + phoneDTO_apple1.getManufacturer()); System.out.println("phoneDTO_apple1, getName : " + phoneDTO_apple1.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO phoneDTO_apple2 = (PhoneDTO) context.getBean("phoneDTO_apple2"); System.out.println("phoneDTO_apple2, getManufacturer : " + phoneDTO_apple2.getManufacturer()); System.out.println("phoneDTO_apple2, getName : " + phoneDTO_apple2.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO phoneDTO_apple3 = (PhoneDTO) context.getBean("phoneDTO_apple3"); System.out.println("phoneDTO_apple3, getManufacturer : " + phoneDTO_apple3.getManufacturer()); System.out.println("phoneDTO_apple3, getName : " + phoneDTO_apple3.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO2 phoneDTO2_apple = (PhoneDTO2) context.getBean("phoneDTO2_apple"); System.out.println("phoneDTO2_apple, getManufacturer : " + phoneDTO2_apple.getManufacturer()); System.out.println("phoneDTO2_apple, getName : " + phoneDTO2_apple.getName()); System.out.println("phoneDTO2_apple, getName : " + phoneDTO2_apple.getPrice()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO phoneDTO_samsung1 = (PhoneDTO) context.getBean("phoneDTO_samsung1"); System.out.println("phoneDTO_samsung1, getManufacturer : " + phoneDTO_samsung1.getManufacturer()); System.out.println("phoneDTO_samsung1, getName : " + phoneDTO_samsung1.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO phoneDTO_samsung2 = (PhoneDTO) context.getBean("phoneDTO_samsung2"); System.out.println("phoneDTO_samsung2, getManufacturer : " + phoneDTO_samsung2.getManufacturer()); System.out.println("phoneDTO_samsung2, getName : " + phoneDTO_samsung2.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO phoneDTO_samsung3 = (PhoneDTO) context.getBean("phoneDTO_samsung3"); System.out.println("phoneDTO_samsung3, getManufacturer : " + phoneDTO_samsung3.getManufacturer()); System.out.println("phoneDTO_samsung3, getName : " + phoneDTO_samsung3.getName()); System.out.println("------------------------------------------------------------------------------------"); PhoneDTO2 phoneDTO2_samsung = (PhoneDTO2) context.getBean("phoneDTO2_samsung"); System.out.println("phoneDTO2_samsung, getManufacturer : " + phoneDTO2_samsung.getManufacturer()); System.out.println("phoneDTO2_samsung, getName : " + phoneDTO2_samsung.getName()); System.out.println("phoneDTO2_samsung, getName : " + phoneDTO2_samsung.getPrice()); } // main } // ParentTest /* * 실행결과 * * phoneDTO_apple1, getManufacturer : apple * phoneDTO_apple1, getName : iPhone 5S * ------------------------------------------------------------------------------------ * phoneDTO_apple2, getManufacturer : apple * phoneDTO_apple2, getName : iPhone 5S * ------------------------------------------------------------------------------------ * phoneDTO_apple3, getManufacturer : apple * phoneDTO_apple3, getName : iPhone 5C * ------------------------------------------------------------------------------------ * phoneDTO2_apple, getManufacturer : apple * phoneDTO2_apple, getName : iPhone 5S * phoneDTO2_apple, getName : 981283823 * ------------------------------------------------------------------------------------ * phoneDTO_samsung1, getManufacturer : samsung * phoneDTO_samsung1, getName : GALAXY Note3 * ------------------------------------------------------------------------------------ * phoneDTO_samsung2, getManufacturer : samsung * phoneDTO_samsung2, getName : GALAXY S4 * ------------------------------------------------------------------------------------ * phoneDTO_samsung3, getManufacturer : samsung * phoneDTO_samsung3, getName : GALAXY S4 * ------------------------------------------------------------------------------------ * phoneDTO2_samsung, getManufacturer : samsung * phoneDTO2_samsung, getName : GALAXY S4 * phoneDTO2_samsung, getName : 8210312 */
// PhoneDTO.java package com.tistory.gangzzang.parent; public class PhoneDTO { private String name; private String manufacturer; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getManufacturer() { return manufacturer; } public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } } // PhoneDTO
// PhoneDTO2.java package com.tistory.gangzzang.parent; public class PhoneDTO2 { private String name; private String manufacturer; private int price; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getManufacturer() { return manufacturer; } public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } } // PhoneDTO2
'Web > Spring' 카테고리의 다른 글
스프링(Spring) MVC 프레임워크(Model View Controller Framework) (17) | 2013.11.06 |
---|---|
스프링(Spring) DI(Dependency Injection) - #2 (0) | 2013.11.02 |
스프링(Spring) IoC 컨테이너(Inversion of Control Container) (0) | 2013.10.30 |
스프링(Spring) 파일 다운로드(File Download) (6) | 2013.10.23 |
스프링(Spring) 파일 업로드(File Upload) (10) | 2013.10.23 |