DI, 의존성 주입 확인하기
- Car와 Engine이라는 두개의 클래스를 생성한다.
1. spring 사용 x
Engine.java
package kr.or.connect.diexam01;
public class Engine {
public Engine() {
System.out.println("Engine 생성자");
}
public void exec() {
System.out.println("엔진이 동작합니다.");
}
}
Car.java
package kr.or.connect.diexam01;
public class Car {
Engine v8;
public Car() {
System.out.println("Car 생성자");
}
public void setEngine(Engine e) {
this.v8 = e;
}
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
public static void main(String[] args) {
Engine e = new Engine();
Car c = new Car();
c.setEngine(e);
c.run();
}
}
- spring을 사용하지 않는다면 우리는 Engine와 Car 클래스를 구현하고 new를 사용하여 객체를 생성한 후에야 해당 인스턴스를 사용할 수 있다.
- spring ioc 컨테이너가 이 역할을 해줄 수 있고 그러기 위해서는 해당 bean들을 먼저 등록해야한다.
2. Spring 사용 O
applicationContext.xml에 해당 코드 추가
<bean id="e" class="kr.or.connect.diexam01.Engine"/>
<bean id="c" class="kr.or.connect.diexam01.Car">
<property name="engine" ref="e"></property>
</bean>
- 프로퍼티는 setter, getter 메서드 중에 하나를 의미한다. 즉, name이 engine인 property는 setEngine, getEngine을 의미한다.
- 하지만 bean 태그 내에서는 값을 설정하는 것이기 때문에 setEngime을 의미한다. 파라미터로는 Engine 타입인 e를 받는 것이다.
- 이처럼 어떤 객체에게 객체를 주입하는 것을 DI라고 한다.
ApplicationContextExam02.java
public class ApplicationContextExam02 {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
Car car = (Car)ac.getBean("car");
car.run();
}
}
- 실행클래스의 코드에는 엔진이 없다. 우리는 car만 사용할 줄 알면 된다.
- 스프링 버전이 올라가면서 빈대신 더 편리한 자바 config와 어노테이션을 사용한다.