본문 바로가기
Java Web Programming/6. Spring | MyBatis

[Spring] 생성자를 통한 DI/DL 적용(constructor-arg) + IOC + maven

by 파프리카_ 2020. 10. 27.
728x90
반응형

SpringBean Configuration file

 

/ioc.xml 

<bean> = DL 방식 (id= ticket, peson로 객체 할당 - TestIOC에서 getBean으로 검색하여 할당받기 가능)

<constructor-arg> = DI 방식, 생성자에 값 주입(name과 ticket을 주입해줌)

 

- ticket과 person에 DL 방식으로 할당- person을 생성하기 위해 <constructor-arg> 에 생성자 요소를 DI방식으로 주입해준다.

<?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">
	
	<!-- 객체 생성 시 주입을 통해 할당 (DI방식) -->
	<bean id="ticket" class="model.KETicket"></bean>
	<bean id="person" class="model.Person">
		<!-- 생성자 -->
		<constructor-arg>
			<value>아이유</value>		
		</constructor-arg>
		<constructor-arg>
			<ref bean="ticket"/>		
		</constructor-arg>
	</bean>
	
</beans>

/model

 

/Ticket.java <<interface>>

package model;

public interface Ticket {
	public void ticketing();
}

 

name or ticket을 set할 때,  Spring IOC Container로부터 주입받는다.

+ name과 Ticket의 생성자를 생성한다.

/Person.java

package model;

public class Person {
	private String name;
	private Ticket ticket;

	public Person(String name, Ticket ticket) {
		super();
		this.name = name;
		this.ticket = ticket;
	}
	
	public String getName() {
		return name;
	}
	/**
	 * name을 Spring IOC Container로부터 주입받는다.
	 * (DI:Dependency Injection 방식)
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	public Ticket getTicket() {
		return ticket;
	}
	/**
	 * ticket을 Spring IOC Container로부터 주입받는다.
	 * @param ticket
	 */
	public void setTicket(Ticket ticket) {
		this.ticket = ticket;
	}
	
}

 

/KETicket.java

package model;

public class KETicket implements Ticket {

	@Override
	public void ticketing() {
		System.out.println("대한항공 티켓을 예매하다.");
	}
}

 

/OZTicket.java

package model;

public class OZTicket implements Ticket {

	@Override
	public void ticketing() {
		System.out.println("아시아나 티켓을 예매하다.");
	}
}

/test

 

/TestIOC.java

package test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import model.Person;
import model.Ticket;

public class TestIOC {
	public static void main(String[] args) {
		//spring IOC container의 config를 factory에 할당
		ClassPathXmlApplicationContext factory
			= new ClassPathXmlApplicationContext("ioc.xml");
		
		/* DL 방식(config에서 id를 통해 검색하여 가져옴) */
		System.out.println("---DL 방식---");

		// ticket 객체를 확보해서 사용
		Ticket ticket = (Ticket) factory.getBean("ticket");
		ticket.ticketing();
		
		// person 객체를 확보해서 사용
		Person person = (Person) factory.getBean("person");
		
		
		/* DI 방식(config에서 값을 주입함) */
		System.out.println("---DI 방식---");
		
		// DI방식으로 주입받은 name을 출력
		System.out.println(person.getName());
		
		// DI방식으로 주입받은 ticket의 ticketing을 실행
		person.getTicket().ticketing();
		
		factory.close();
	}
}

[ 결과 ] 

 

728x90
반응형