설정파일에서 객체를 전달하는 방법: 생성자 방식, setter 메서드 방식



1) 테이블 DbTable.java


package com.model.di.exam02;


public class DbTable {


@Override

public String toString() {

return "테이블에 레코드 삽입 성공";

}

}



2) DAO에서 DbTable을 불러와 insert 메서드를 구현하는 DaoImpl.java


package com.model.di.exam02;


public class DaoImpl {


public void insert(DbTable table) {

System.out.println("DaoImple.insert() 메서드 실행");

System.out.println(table);

}

}





3) 인터페이스 Service.java

package com.model.di.exam02;

public interface Service {

public void write(DbTable article);
}




4) 서비스 영역을 묘사한 ServiceImpl.java


package com.model.di.exam02;


public class ServiceImpl implements Service {

private DaoImpl daoImpl;

public ServiceImpl(DaoImpl daoImpl) {  

this.daoImpl = daoImpl;  // daoImpl 객체를 초기화하는 기능을 생성자로 정의

} // daoImpl 타입의 객체를 입력으로 받게끔 정의함

/* 

Dao 영역의 insert를 서비스 영역에서 호출하기 위해 객체를 호출하려면 new로 생성하지 않고

생성자 호출할 때 스프링이 생성한 daoImpl도 넣어달라고 요청해야 함.

설정파일 xml에서 service를 bean 정의시 daoImpl는 ref로 받는다고 표시해줘야 함. 

*/

public void write(DbTable article) {

System.out.println("ServiceImpl.write() 메서드 실행");

daoImpl.insert(article); 

// 기존 MVC 패턴의 dao 호출을 간단하게 구현

// dao 파트의 객체를 전달받아 write라는 메서드를 통해 insert라는 메서드를 호출.

}

}





5) 설정 파일 applicationContext.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">


<bean id="messageBean" class="com.model.di.exam01.MessageBean"></bean>

 <!-- 생성자를 통해 객체를 전달하는 경우: bean의 자식태그로 constructor-arg 사용 -->

<bean id="service" class="com.model.di.exam02.ServiceImpl">

<!-- ServiceImpl 생성자 호출할 때  daoImpl 객체를 입력으로 받아오므로 아래와 같이 해야함 -->

<constructor-arg>

<ref bean="daoImpl" /> 

<!-- 스프링이 생성한 아래의 daoImpl 객체를 serviceImple에 레퍼런스로 전달 -->

</constructor-arg>

</bean>


 <!-- setter 메서드를 통해 객체를 전달하는 경우: bean의 자식태그로 property 사용 -->

<bean id="service2" class="com.model.di.exam03.ServiceImplement">

<property name="daoImpl"><ref bean="daoImpl" /></property> 직접 자식태그로 ref를 사용하는 경우

 <!-- <property name="daoImpl" ref="daoImpl" /> 프로퍼티 태그 안에 property와 ref를 사용하는 경우 -->

</bean>


// property의 name은 자바빈의 setter 메서드 (프로퍼티 이름)

// ref는 아래에 호출해서 불러올 property의 name (빈 객체 이름)


<bean id="table" class="com.model.di.exam02.DbTable"></bean>

<bean id="daoImpl" class="com.model.di.exam02.DaoImpl"></bean>

</beans>





6) 실행을 위한 Main.java


package com.model.di.exam02;

import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.model.di.exam01.MessageBean;


public class Main {


public static void main(String[] args) {

AbstractApplicationContext context = 

new ClassPathXmlApplicationContext("applicationContext.xml"); 

context.registerShutdownHook(); 

DbTable table = (DbTable)context.getBean("table");

// DaoImpl daoImpl = (DaoImpl)context.getBean("daoImpl");

// daoImpl.insert(table);


Service service = (Service) context.getBean("service");  // Service는 인터페이스명

   service.write(table);


context.close();

}

}


7) 실행 결과

ServiceImpl.write() 메서드 실행

DaoImple.insert() 메서드 실행

테이블에 레코드 삽입 성공






Posted by netyhobby
,