on
[SPRING] :: DEPENDENCY INJECTION
[SPRING] :: DEPENDENCY INJECTION
의존성 주입 (DEPENDENCY INJECTION)
:: 외부에서 생성한 BEAN객체를 REF 속성으로 참조하는 방식
:: 스프링에서는 ROOT-CONTEXT에서 BEAN태그를 사용하여 객체를 생성되며 ROOT-CONTEXT에서 객체를 생성한다.
:: 생성한 객체는 기본적으로는 SINGLETON의 타입으로서 APPLICATIONSCOPE 영역에 저장된다.
BEAN 객체 :: BEAN이란, 스프링에서 컨테이너에서 생성되는 자바 객체라고 할 수 있다. :: ROOT-CONTEXT에서는 BEAN이라는 태그를 사용하여 셋터, 생생자등의 방식으로 객체를 생성할 수 있다. :: BEAN은 하나의 객체를, BEANS는 BEAN 객체를 모아두는 주머니 개념이다. :: 객체에 생성자, 셋터가 없으면 호출이 안되며 PROPERTY나 CONSTRUCTOR등의 속성은 반드시 객체의 변수명과 일치해야한다. # 셋터 인젝션
# 생성자 인젝션
BEAN 객체의 속성
속성 (멤버) 설명 ID 생성하고자하는 객체명 CLASS 생성하는 클래스의 명칭 SCOPE 객체의 생성방식 (기본값은 SINGLETON, PROTOTYPE은 VO객체처럼 선언시마다 생성되는 객체타입) REF 외부에서 생성된 빈객체를 참조
[예시] :: 셋터 인젝션 :: 객체 내부의 셋터를 통해서 ROOT-CONTEXT의 PROPERTY속성값으로 객체가 생성되는 방식 :: 기본 생성자를 통해서 호출하는 방식으로 클래스 내부에 따로 생성자를 생성 시 기본 생성자가 없으면 호출이 되지 않는다. # PERSONVO.JAVA package vo; // 스프링에서는 사용하는 클래스에 기본 생성자가 있어야한다. public class PersonVO { private String name; private int age; private String tel; public String getName() { return name; } public void setName(String name) { System.out.println("---setName()---"); this.name = name; } public int getAge() { return age; } public void setAge(int age) { System.out.println("---setAge()---"); this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { System.out.println("---setTel()---"); this.tel = tel; } }
# ROOT-CONTEXT.XML
[참고] :: 프로젝트 동작 시 PERSONVO 객체가 생성되어 VO의 SETTER가 동작한다.
[예시] :: 생성자 인젝션
:: 객체 내의 생성자를 통해서 BEAN 태그에서 참조하는 파라미터로 객체가 생성되는 방식
:: 생성자의 파라미터 순대로 BEAN태그의 속성이 있어야한다.
# PERSONVO.JAVA
package vo; public class PersonVO { private String name; private int age; private String tel; // BEANS는 기본 생성자를 호출하는 방식으로 기본 생성자가 없을 시 동작하지 않는다. public PersonVO() { System.out.println("PersonVO의 생성자"); } // 세가지의 변수를 동시에 받아주는 생성자 작성 public PersonVO(String name, int age, String tel) { System.out.println("---파라미터를 세개 받는 생성자---"); this.name = name; this.age = age; this.tel = tel; } }
# ROOT-CONTEXT.XML
[참고] :: 프로젝트 동작 시 PERSONVO 객체가 생성되어 VO의 생성자가 동작한다.
[예시] :: REF 속성으로 의존성 주입
# PERSONVO.JAVA
package vo; public class PersonVO { private String name; private int age; private String tel; // BEANS는 기본생성자를 호출하는 방식으로 기본생성자가 있어야한다. public PersonVO() { System.out.println("PersonVO의 생성자"); } public PersonVO(String name, int age, String tel) { System.out.println("---파라미터를 세개 받는 생성자---"); this.name = name; this.age = age; this.tel = tel; } public String getName() { return name; } public void setName(String name) { System.out.println("---setName()---"); this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
# ROOT-CONTEXT.XML
[예시] :: SCOPE 속성
:: 객체의 생성 방식 지정
:: 기본값은 SINGLE-TON으로 객체가 한번 생성되면 재 생성없이 계속 사용할 수 있는 형태
:: PROTOTYPE 지정 시, 호출마다 새로 생성하는 일반 객체 생성 방식이 된다.
# PERSONVO.JAVA
package vo; public class PersonVO { private String name; private int age; private String tel; // BEANS는 기본생성자를 호출하는 방식으로 기본생성자가 있어야한다. public PersonVO() { System.out.println("PersonVO의 생성자"); } public PersonVO(String name, int age, String tel) { System.out.println("---파라미터를 세개 받는 생성자---"); this.name = name; this.age = age; this.tel = tel; } public String getName() { return name; } public void setName(String name) { System.out.println("---setName()---"); this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
# ROOT-CONTEXT.XML
# USE_SPRING.JSP
:: APPLICATION 영역에 저장된 객체는 SPRING에서는 서블릿의 내장객체로 바로 접근이 안된다.
:: 그래서 WEBAPPLICATIONCONTEXT를 통해서 APPLICATION에 접근한다.
<%@page import="org.springframework.web.context.request.RequestScope"%> <%@page import="vo.PersonVO"%> <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%> <%@page import="org.springframework.web.context.WebApplicationContext"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% /* SPRING의 BEAN안에 저장된 내용을 JSP에서 불러오는 방법 ROOT-CONTEXT에서 생성된 객체는 APPLICATION 영역에 저장이 된다. JSP에서는 내장객체인 APPLICATION에서 바로 접근이 가능하나 SPRING에서는 서블릿의 내장객체로 바로 접근이 안된다. 그러므로 WEBAPPLICATIONCONTEXT를 통해서 APPLICATION 영역에 접근한다. */ // WEBAPPLICATIONCONTEXT 객체 생성 WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(application); /* GETBEAN을 통해서 APPLICATION SCOPE에 접근할 수 있지만 컴파일러는 P1으로 저장한 것이 무엇인지 알 수 없기 때문에 가지고올 스프링의 객체가 PERSONVO타입이라는 것을 명시하기위해서 캐스팅이 필요하다. WAC의 GETBEAN으로 BEAN객체에 접근한다. 영역에 접근할 수 있으나 컴파일러는 P1에 저장된 값이 어떤 것인지 알 수 없으므로 가지고 오는 SPRING의 객체가 PERSONVO 타입이라는 것을 명시해주는 캐스팅이 있어야한다. (나중에는 둘다 사용하지 않는 방식으로 일단은 기본적인 구조 파악을 위한 설명)*/ PersonVO p1 = (PersonVO)wac.getBean("p1"); // 방식 1 PersonVO p2 = wac.getBean("p2", PersonVO.class); // 방식 2 // BODY에서 사용할 수 있도록 REQUESTSCOPE영역에 저장 request.setAttribute("p1", p1); request.setAttribute("p2", p2); // 셋터 방식의 의존성 주입으로 생성한 객체 P3 (SINGLE-TON) // 생성자 방식의 의존성 주입으로 생성한 객체 P4 (PROTOTYPE) PersonVO p3 = (PersonVO)wac.getBean("p3"); PersonVO p4 = (PersonVO)wac.getBean("p4"); // REQUEST영역에 저장 request.setAttribute("p3", p3); request.setAttribute("p4", p4); %> Insert title here ${ p1.name } / ${ p1.age } / ${ p1.tel } ${ p2.name } / ${ p2.age } / ${ p2.tel } ${ p3.name } / ${ p3.age } / ${ p3.tel } ${ p4.name } / ${ p4.age } / ${ p4.tel }
from http://hikr90.tistory.com/146 by ccl(A) rewrite - 2021-12-31 21:28:06