1. DI는 디자인 패턴의 일종이다.
DI(Dependency Injection) 의존성 주입을 이해하기 위해서 의존성이 무엇인지 살펴 보았다.
public class ElectronicCarToy {
private Battery battery;
public ElectronicCarToy() {
battery = new NormalBattery();
}
}
해당 클래스 안에는 새로운 Battery라는 객체를 생성한다.
이와 같이 클래스 안에 다른 클래스를 가지게 되는것을 의존성을 가졌다고 말한다.
그런데 이와 같은 코드에서
Battery가 다른 객체로 바뀌어야 할 경우에는 ElectronicCarToy 객체 마저 변해야 한다.
이를 막고자 의존성 주입이라는 디자인 패턴이 있다.
public class ElectronicRadioToy {
private Battery battery;
public ElectronicRadioToy(Battery battery) {
this.battery = battery;
}
public void setBattery(Battery battery) {
this.battery = battery;
}
}
위의 코드는 생성자 생성 시 혹은 메소드를 이용하여 파라미터를 받아 전달할 뿐이다.
2. Spring은 동적으로 DI를 해준다.
XML을 통해서 Bean과 BeanContainer를 만들 수 있다.
Bean객체를 생성할 때,
생성자에서 혹은 메소드에서 전달 할 수 있게 된다.
3. 실습
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="라디오" class="lec06Pjt001.toy.ElectronicRadioToy" >
<constructor-arg ref="충전배터리"></constructor-arg>
</bean>
<bean id="충전배터리" class="lec06Pjt001.battery.ChargeBattery" >
<property name="type" value="충전형"> </property>
</bean>
<bean id="일반배터리" class="lec06Pjt001.battery.NormalBattery" >
<property name="type" value="일반형"> </property>
</bean>
</beans>
< applicationContext.xml >
첫번째 빈은 라디오 객체를 생성하는 빈이다.
id는 Bean의 이름을 뜻하고 class는 어떤 클래스 인지 경로를 설정해준다.
그리고 constructor-arg는 생성자의 전달값을 설정한다.
이 때 ref 에는 빈 객체를 입력해준다.
public class MainClass {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Toy radioToy = (Toy) context.getBean("라디오");
radioToy.checkBattry();
context.close();
//Toy radioToy = new ElectronicRadioToy(new ChargeBattery());
//radioToy.checkBattry();
}
}
< MainClass.java >
위는 스프링을 이용한 DI
아래는 기본 자바의 DI 이다.
실제 ClassPathXmlApplicationContext를 통해서 xml파일에서 Container를 생성한다.
그리고 그 중 생성된 라디오 객체를 가져온 모습이다.
public class ElectronicRadioToy implements Toy {
private Battery battery;
public ElectronicRadioToy(Battery battery) {
this.battery = battery;
}
public void checkBattry() {
battery.checker();
}
/*
* public void setBatteryType() {
* battery.setType("충전형");
* }
*/
}
< ElectronicRadioToy.java >
구현체인 라디오장난감 객체이다.
Battery 객체를 가지고 있고
Battery 객체의 checker 메소드를 불러오는 메소드를 가지고 있다.
아래의 주석처리된 setBatteryType() 은 battery의 Type을 설정해주는 메소드인데,
Battery 객체가 Toy에 완전히 종속되어 있어서, Toy 이외에서 battery의 메소드를 불러올 수 없게 된다.
<bean id="충전배터리" class="lec06Pjt001.battery.ChargeBattery" >
<property name="type" value="충전형"> </property>
</bean>
< applicationContext.xml >
이를 빈 객체를 생성하므로써 문제를 해결 할 수 있다.
property는 set메소드의 파라미터값을 넘겨주게 된다.
public class ChargeBattery implements Battery {
String type;
public void setType(String type) {
this.type = type;
}
public void checker() {
System.out.println(type+"오케이");
}
}
< ChargeBattery >
보시다시피 setBatteryType이 주석처리됬음에도 불구하고 오류가 없이 실행된다.
'BackEnd > Spring' 카테고리의 다른 글
Tomcat (0) | 2019.07.02 |
---|---|
Maven (0) | 2019.07.02 |
[실습] DB데이터로 Navigation 만들기 (Mybatias,Gson) (0) | 2019.06.04 |
Tiles설치 및 사용하여 html 템플릿 관리하기 (0) | 2019.06.03 |
JSP-Servelet 게시판 제작하기 (1) (0) | 2019.05.31 |