n 이전에 작성한 예제를 어노테이션 기반으로 변경 해보자.
[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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <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(); } } |
실행 후 결과를 확인하자.
ioc4.xml을 대신하여 자바 설정으로 변경해보자.
[MyConfig.java]
package edu.biz.ioc4;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;
@Configuration @ComponentScan("edu.biz.ioc4") public class MyConfig { } |
[OrderManagerApp.java]
package edu.biz.ioc4;
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class OrderManagerApp { public static void main(String[] args) { // @Configuration 어노테이션이 적용된 클래스를 설정 정보로 이용하기 위해 // AnnotationConfigApplicationContext를 이용하면 된다. ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); OrderManager manager = context.getBean(OrderManager.class); 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(); } } |