728x90
반응형

Spring 은 경량 컨테이너 이다. 

컨테이너는 컴포넌트들의 라이프사이클을 관리하는 걸 말하는데 예를 들어 톰캣,스윙(JPanel) 등...

Spring도 마찬가지로 초기화작업이나 소멸시에 작동할 작업을 설정을 통해 미리 지정해주는것이 가능하다. 


LifeCycleBean.java

package test.life;

public class LifeCycleBean {

public void init() {

System.out.println("초기화 메소드 입니다.");

}

public void execute() {

System.out.println("요청 작업을 수행합니다.");

}

public void destroy() {

System.out.println("객체가 소멸될때 호출되는 메소드입니다.");

}

}


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">

<!-- 

객체가 생성될떄 init 메소드가 호출되고 객체가 소멸될때 destroy 메소드가 호출된다. 

init-method : 객체 생성시 호출되는 메소드 지정 (초기화작업)

destroy-method : 객체소멸시 호출되는 메소드 (자원해제등의 작업)

-->

<bean name="life" class="test.life.LifeCycleBean"

init-method="init" destroy-method="destroy"

/>

</beans>



scope 속성을 이용하여 LifeCycle 을 관리할 수 있다. 

init-method : 객체 생성시 호출되는 메소드 지정 (초기화작업)

destroy-method : 객체소멸시 호출되는 메소드 (자원해제등의 작업)


728x90
반응형
728x90
반응형

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 이기 때문에 모든 클래스타입으로의 형변환이 가능하다.


728x90
반응형

+ Recent posts