Spring DI ( Dipendency Injection ) 을 이용하여 객체를 조립하는 방법에 대해 알아보자.
기본적으로 DI 를 이용한 bean 생성은 내부적으로 싱글톤 패턴을 이용해 객체를 인스턴스화 한다.
Spring DI 를 사용하지 않을시에 는 아무리 인터페이스의 다형성을 이용하여 유연한 코드를 작성하였다하여도
자식클래스의 인스턴스 를 변경하게 될수있는데 DI 패턴을 이용하면 그 문제를 해결할 수 있다,
test01.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.xsd">
<!-- OracleDao 를 생성해라 -->
<bean name="daoOra" class="test.dao.OracleDao"/>
<bean name="daoMy" class="test.dao.MysqlDao"/>
<!-- MyController 를 생성하고 OracleDao 를 주입해라. -->
<bean name="controller" class="test.controller.MyController">
<!-- 위에서 생성한 daoOra 를 멤버변수 dao 에 주입해라. -->
<!-- value = 문자열 , ref = 객체 참조값 -->
<!-- <property name="dao" ref="daoOra"/> -->
<property name="dao" ref="daoMy"/>
</bean>
<!--
[[ scope 속성 ]]
- 스프링은 기본적으로 객체를 싱글톤객체로 생성한다.
- singleton : 객체를 하나만 생성(싱글톤 객체로 생성)
- prototype : 객체를 사용할때마다 생성
- request : 클라이언트가 요청할때마다 생성 ( WebApp 에서만 사용 )
- session : 세션에서만 가능 ( WebApp 에서만 사용 )
-->
<bean name="oracleDao" class="test.dao.OracleDao"
scope="prototype">
</bean>
</beans>
CommonDao.java
package test.dao;
// DAO가 가져야할 기능들의 목록을 정의
public interface CommonDao {
// interface 에서의 메서드는 기본적으로 public 임..
void insert( String data );
void update( String data );
void delete( String data );
void select( String data );
}
MysqlDao.java
package test.dao;
public class MysqlDao implements CommonDao {
@Override
public void insert(String data) {
// TODO Auto-generated method stub
System.out.println("mysql을 이용하여 "+data+" 를 추가");
}
@Override
public void update(String data) {
// TODO Auto-generated method stub
System.out.println("mysql을 이용하여 "+data+" 를 수정");
}
@Override
public void delete(String data) {
// TODO Auto-generated method stub
System.out.println("mysql을 이용하여 "+data+" 를 삭제");
}
@Override
public void select(String data) {
// TODO Auto-generated method stub
System.out.println("mysql을 이용하여 "+data+" 를 조회");
}
}
OracleDao.java
package test.dao;
public class OracleDao implements CommonDao {
public void insert( String data ) {
System.out.println(data+"를 추가 했습니다.");
}
public void delete( String data ) {
System.out.println(data+"를 삭제 했습니다.");
}
public void select( String data ) {
System.out.println(data+"를 조회 했습니다.");
}
public void update( String data ) {
System.out.println(data+"를 수정 했습니다.");
}
}
MyController.java
package test.controller;
import test.dao.CommonDao;
public class MyController {
// 다형성을 이용
private CommonDao dao;// = new OracleDao();
// 스프링이 생성한 객체를 주입받아야 하므로 setter 메소드가 필요하다.
public void setDao( CommonDao dao ) {
this.dao = dao;
}
public void insert( String data ) {
dao.insert(data);
}
public void delete( String data ) {
dao.delete(data);
}
public void update( String data ) {
dao.update(data);
}
public void select( String data ) {
dao.select(data);
}
}
TestMain.java
package test.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test.controller.MyController;
import test.dao.OracleDao;
public class TestMain {
public static void main(String[] args) {
String res = "test/main/test01.xml";
ApplicationContext context =
new ClassPathXmlApplicationContext(res);
// spring 은 기본적으로 싱글턴으로 객체를 생성
MyController controller =
(MyController)context.getBean("controller");
controller.select("이상훈");
controller.delete("이상훈");
controller.update("이상훈");
controller.insert("이상훈");
MyController controller1 =
(MyController)context.getBean("controller");
// 아래 두객체는 같은 객체 임 기본 싱글턴 이기때문..
System.out.println("controller : "+controller);
System.out.println("controller1 : "+controller1);
// Bean 설정파일에서 scope="prototype" 옵션을 주었으므로 객체를
// 사용할떄마다 객체를 계속 생성한다. 아래 두객체는 다른 객체
OracleDao oracle = (OracleDao)context.getBean("oracleDao");
System.out.println("oracle : "+oracle);
OracleDao oracle1 = (OracleDao)context.getBean("oracleDao");
System.out.println("oracle : "+oracle1);
}
}
[출력결과]
간단하게 생성을 해보았는데 TestMain.java 의 context.getBean(); 인스턴스를 가져오고 반환형이 Object 이기 때문에 모든 클래스타입으로의 형변환이 가능하다.
'JAVA > Spring' 카테고리의 다른 글
[Project Reactor] Schedulers 정리 (0) | 2019.12.11 |
---|---|
Spring WebFlux와 Kotlin으로 만드는 Todo 서비스 – 2편 (0) | 2019.09.05 |
Spring WebFlux와 Kotlin으로 만드는 Todo 서비스 - 1편 (1) | 2019.08.27 |
Spring DI 예제 3 - 싱글턴 인스턴스의 생성 (0) | 2013.11.02 |
Spring DI 예제 2 - LifeCycle (0) | 2013.11.02 |