스프링 제어의역행(Spring Ioc) 실습(어노테이션기반, 인터페이스, 세터주입)
2-2에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
[Money.java]
package edu.biz.ioc4;
import org.springframework.stereotype.Component;
@Component("money") // DTO같은 컴포넌트 클래스임을 의미, @Named와 동일
public class Money {
private int amount;
public Money() {
}
public Money(int amt) {
this.amount = amt;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
[Car.java]
package edu.biz.ioc4;
import org.springframework.stereotype.Component;
@Component("car")
public class Car {
private String name;
public Car() {
}
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
[CarMaker.java]
package edu.biz.ioc4;
public interface CarMaker {
//돈을 받고 차를 판다
public Car sell(Money money) ;
}
[HyundaiMaker.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("hyundai") //@Named와 동일, 서비스계층의 클래스임을 의미
public class HyundaiMaker implements CarMaker{
@Autowired //@Inject와 동일
private Car car;
public Car sell(Money money) {
System.out.println("I sold a Sonata.");
car.setName("Sonata");
return car;
}
}
[DaewooMaker.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(“daewoo")
public class DaewooMaker implements CarMaker{
@Autowired
private Car car;
public Car sell(Money money) {
System.out.println("I sold a Tosca.");
car.setName(“Tosca");
return car;
}
}
[OrderManager.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("orderManager")
public class OrderManager {
private String name;
@Autowired // TYPE이 CarMaker 인것 찾아 자동 주입, 여러 개인 경우 Qualifier로 지정
@Qualifier("daewoo")
private CarMaker maker;
@Autowired // TYPE이 Money 인 것을 찾아 자동 주입
private Money money;
public OrderManager() {
}
public void order() {
money.setAmount(1000);
Car car = this.maker.sell(money);
}
}
[ioc4.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-4.2.xsd">
<beans>
<context:annotation-config/> 생략가능!!
<context:component-scan base-package="edu.biz.ioc4"/>
</beans>
[OrderManagerApp.java]
package edu.biz.ioc4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class OrderManagerApp {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:ioc4.xml");
OrderManager manager = (OrderManager) factory.getBean("orderManager");
manager.order();
}
}
실행 후 결과를 확인하자.
[수정된 OrderManagerApp.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class OrderManagerApp {
//생성자가 아닌 직접 autowiring은 불가, static변수는 autowiring 안된다.
static OrderManager orderManager;
@Autowired
public OrderManagerApp(OrderManager orderManager) {
OrderManagerApp.orderManager = orderManager;
}
public static void main(String[] args) {
ApplicationContext factory =
new ClassPathXmlApplicationContext("classpath:ioc4.xml");
//OrderManager manager = (OrderManager) factory.getBean("orderManager");
orderManager.order();
}
}