728x90

=============================================================
키 | 자바스크립트 코드(숫자)
=============================================================

←(백스패이스) = 8
TAB = 9
ENTER = 13
SHIFT = 16
CTRL = 17
ALT = 18
PAUSEBREAK = 19
CAPSLOOK = 20
한/영 = 21
한자 = 25
ESC = 27

스패이스 = 32
PAGEUP = 33
PAGEDN = 34
END = 35
HOME =36

←(중간) = 37
↑(중간) = 38
→(중간) = 39
↓(중간) = 40

0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
INSERT = 45
DELETE = 46

A = 65
B = 66
C = 67
D = 68
E = 69
F = 70
G = 71
H = 72
I = 73
J = 74
K = 75
L = 76
M = 77
N = 78
O = 79
P = 80
Q = 81
R = 82
S = 83
T = 84
U = 85
V = 86
W = 87
X = 88
Y = 89
Z = 90

윈도우(왼쪽) = 91
윈도우(오른쪽) = 92
기능키 = 93
0(오른쪽) = 96
1(오른쪽) = 97
2(오른쪽) = 98
3(오른쪽) = 99
4(오른쪽) = 100
5(오른쪽) = 101
6(오른쪽) = 102
7(오른쪽) = 103
8(오른쪽) = 104
9(오른쪽) = 105
.(오른쪽) = 110
/(오른쪽) = 111
*(오른쪽) = 106
+(오른쪽) = 107
-(오른쪽) = 109
F1 = 112
F2 = 113
F3 = 114
F4 = 115
F5 = 116
F6 = 117
F7 = 118
F8 = 119
F9 = 120
F10 = 121
F11 = 122
F12 = 123
NUMLOCK = 144
SCROLLLOCK = 145
=(중간) = 187
-(중간) = 189
`(왼쪽콤마) = 192
(중간) = 220

 

 


































출처 : http://Ssemi.net


728x90
728x90

최근의 대부분 프로젝트는 Sitemesh를 사용하여 개발했었다.
이번에 문서들을 보면서 확인해보니 Tiles2가 나오면서 성능등이 많이 개선이 되었다고한다.
그럼, 해봐야 하지 않겠어?! 해보자.

pom.xml 추가

<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-core</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-jsp</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-servlet</artifactId>
	<version>2.2.2</version>
</dependency>


스프링소스 사이트에서 다운로드받은 STS의 경우 메이븐 pom.xml업데이트만 해도 자동으로 라이브러리가 추가되더라.
따로 메이븐을 설치하여 사용해야하나 고민하고 있었는데, 조금 두고 봐야겠다. 

이제 servlet-context.xml에 Tiles사용을 위한 설정을 해보자.

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/config/tiles_layouts.xml</beans:value>
		</beans:list>
	</beans:property>
	<beans:property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</beans:bean>
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
	<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
</beans:bean>


Tiles2에서 view를 연결하기 때문에 InternalResourceViewResolver를 사용하지 않아도 된다.
하지만, 나는 혹시나 발생할 수 있는 레이아웃없이 jsp페이지만 호출할 일이 있을까 싶어서,
InternalResourceViewResolver를 삭제하지 않았다.

이제 Tiles2의 레이아웃 설정이다.
설정파일은 위에서 지정한 "/WEB-INF/views/config/tiles_layouts.xml" 이 파일이 되겠다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
	<definition name="layouts-tiles" template="/WEB-INF/views/template/layouts-tiles.jsp">
		<put-attribute name="header"    value="/WEB-INF/views/template/header.jsp" />
		<put-attribute name="content"   value="" />
		<put-attribute name="footer"    value="/WEB-INF/views/template/footer.jsp" />
	</definition>
	 
	<definition name="*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}.jsp" />
	</definition>
	<definition name="*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}.jsp" />
	</definition>
	<definition name="*/*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}/{3}.jsp" />
	</definition>
</tiles-definitions>


layouts-tiles설정에서 기본 레이아웃 페이지와 이름을 설정한다.
content의 경우는 유동적으로 바뀌기에 하단에서 layouts-tiles를 extends받아서 추가해 준다.
자신에 맞게 바꾸면 되겠다.

layouts-tiles.jsp 내용

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>Digigroove Intranet</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>


여기까지가 끝이다.
header와 footer는 일반적인 html레이아웃 짜듯이 구성해 주면되겠다.
하나 불편한 점이 있는데, sitemesh의 경우는 header와 body의 내용 혹은 속성을 레이아웃에서
받아서 처리할 수 있있지만 Tiles녀석도 가능한지 아직모르겠다.
문서를 좀 읽어봐야겠다. 

아름답게도 잘 설명해준 블로그가 있어서 살살 따라하다보니 쉽게 되었다.
출처를 밝히며 감사의 마음을 표한다. 앞으로도 이곳 저곳의 자료를 모아올 것 같다.. ㅋㅋ

출처 : http://blog.naver.com/PostView.nhn?blogId=jazz1234k&logNo=40123376205 

728x90
728x90

새로운 프로잭트 프리젠테이션 레이어에 Apache Tiles 를 적용 할 것이냐 OpenSymphony Sitemesh를 사용 할것인가 고민을 좀 했다.

과거에 두가지 모두 사용해본 경험으로는
일단 간편하게 적용하기엔 Sitemesh가 편리했지만 구현 방식에 따른 성능이슈때문에 조금 손이 가더라도 Tiles를 선호했던 것 같다.

잠깐 두개를 비교한 블로그 포스팅을 검색해 보고 Tiles 를 선택 하기로 했다.

전자정부프레임워크에 Tiles 관련 종속 jar를 올려보자.

1. /[프로잭트]/pom.xml

properties 추가

 <properties>
  <spring.maven.artifact.version>3.0.5.RELEASE</spring.maven.artifact.version>
  <org.apache.tiles-version>2.2.2</org.apache.tiles-version>
 </properties>

dependency 추가

  <!-- Tiles -->
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-core</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-servlet</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-jsp</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

2. Spring 설정에 View Resolver 수정

/[프로잭트]/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml 수정

기존 JSTL View 를 2순위로 내리고

Tiles 우선순위를 1로 설정한다.

    <!-- Tiles 2 Resolver -->
 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
  <property name="order" value="1" />
 </bean>

 <!-- Tiles 2 Configurer -->
 <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles/default-layout.xml</value>
   </list>
  </property>
 </bean>
 
    <!--
        - This bean configures the 'prefix' and 'suffix' properties of 
        - InternalResourceViewResolver, which resolves logical view names 
        - returned by Controllers. For example, a logical view name of "vets" 
        - will be mapped to "/WEB-INF/jsp/vets.jsp".
    -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2
    p:viewClass="org.springframework.web.servlet.view.JstlView" 
    p:prefix="/WEB-INF/jsp/egovframework/rte/" p:suffix=".jsp"/>

 

기존 리졸버의 order를 2로 바꾸는 것을 빼먹지 않도록 한다.

 

3. 프로잭트에 맞는 layouts.xml을 설정한다.

layout 설정은 다음 포스트에.


- 참조 사이트 : http://opensrc.tistory.com/116

728x90
728x90

프로젝트를 하다 보면 현재 요청된 HttpServletRequest를 찾고자

할때가 있습니다.

Service,DAO에서 현재의 request가 필요할때가 있을수 있습니다.

(물론 컨트롤러에 인자로 넘기면 됩니다.)

정확한 케이스를 말하긴 힘들지만 실무에서

꼭 필요할때가 있습니다.

그래서 현재의 Request를 스프링에서 가져 오는 방법을

설명 하고자 합니다.


* RequestContextListener 설정하기


web.xml 파일에 아래와 같이 리스너를 설정 합니다.


<listener>

  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>

</listener>


* 현재 HttpServletRequest 객체 가져오는 함수 만들기


public static HttpServletRequest getCurrentRequest() {


       ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder

               .currentRequestAttributes();


       HttpServletRequest hsr = sra.getRequest();

       return hsr;

}


출처 : http://beyondj2ee.tumblr.com/

728x90

'프로그래밍 > spring' 카테고리의 다른 글

@Aspect Annotation을 이용한 로그인 세션 관리  (0) 2016.04.29
Spring3에서 Tiles2 설정  (0) 2016.04.21
Apache Titles 적용하기  (0) 2016.04.21
messageConverter 방법  (0) 2016.04.20
DefaultAnnotationHandlerMapping  (0) 2016.04.20
728x90

spring 3.2 이상에서 사용할 수 있는 messageConverter 방법

오늘 json 데이터를 가져오는 방법을 코드로 짜보면서 도움이 될 거 같아 정리했다.

servlet.xml 에 보면 "컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 1" 과

"컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2" 가 있다.

원하는 방법으로 사용하면 된다.


아래는 Ref는 AnnotationMethodHandlerAdapter가 deprecated 된 이유를 알 수 있는 좋은 블로그가 있어서 참조했다.

Description Ref :)

http://javaiyagi.tistory.com/357

Spring 3.0 의 DefaultAnnotationHandlerMapping 과 AnnotationMethodHandlerAdapter가  Spring 3.1 에선 @Deprecated 되고, 

대신 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter 로 바뀌었다.

이유인즉슨, Controller 의 요청이 메소드 단위로 세분화 되면서 , 

DefaultAnnotationHandlerMapping 이 AnnotationMethodHandlerAdapter로 handler 를 전달해줄 때, 문제가 생겼기 때문이다 .


pom.xml

<!-- jackson Json -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.7.3</version>

</dependency>


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-core-asl</artifactId>

    <version>1.9.13</version>

</dependency>


<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-mapper-asl</artifactId>

    <version>1.9.13</version>

</dependency>


servlet-context.xml

<!-- 컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

<property name="messageConverters">

    <util:list list-class="java.util.ArrayList">

<ref bean="mappingJackson2HttpMessageConverter"/>

    </util:list>

</property>

</bean>

<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

<property name="supportedMediaTypes">

    <list>

<value>text/html;charset=UTF-8</value>

<value>application/json;charset=UTF-8</value>

    </list>

</property>

</bean>

728x90
728x90

스프링 2.5 부터는 Controller 인터페이스를 구현하지 않은 클래스도 어노테이션을 사용하여 컨트롤러로 사용할 수 있게 되었다. 이를 위해 스프링은 @Controller, @RequestMapping 등 컨트롤러를 구현하는데 필요한 어노테이션을 제공하고 있다.

어노테이션을 이용하여 컨트롤러를 구현할 때는 요청 URL 매핑을 @RequestMapping 어노테이션을 이용하여 설정한다.
@RequestMapping 어노테이션을 처리하기 위해서 DefaultAnnotationHandlerMapping 을 HandlerMapping 으로 등록해 주어야 한다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
p:alwaysUseFullPath="true" />


그런데 DispatcherServlet 이 사용하는 설정 파일에 별도의 HandlerMapping 명시를 하지 않으면, DispatcherServlet 은 기본적으로 DefaultAnnotationHandlerMapping 을 등록하므로 디폴트로 설정 파일에 명시를 하지 않아도 된다.

(만약 DispatcherServlet 이 사용하는 스프링 설정 파일에 HandlerAdapter 를 등록했다면, 추가적으로 AnnotationMethodHandlerAdapter 를 빈으로 등록해주어야 어노테이션을 이용한 컨트롤러가 정상 동작함)


이제 @Controller 어노테이션에 대해서 알아보자. @Controller 어노테이션은 클래스 타입에 적용되며, @Controller 를 붙이면 해당 클래스를 웹 요청을 처리하는 컨트롤러로 사용할 수 있다.

@Controller
public class HelloController {
...
}


컨트롤러로 사용하기 위해 @Controller 가 적용된 클래스는 <bean> 태그에서 스프링 빈으로 등록해주면 된다.

<bean id="helloController" class="...package.HelloController" />


아니면 <context:component-scan> 태그를 이용하여 @Controller 를 적용한 클래스를 자동으로 로딩할 수 있다.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    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-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context2.5.xsd">
    
    <context:component-scan
        base-package="...package" />


</beans>


위에서 component-scan 영역은 base-package 까지만 잡아주면 된다. 클래스 명을 제외한 패키지 이름까지만.

정리해보면 @Controller 어노테이션을 적용한 클래스는 <bean> 태그를 이용하거나 <context:component-scan> 태그를 이용하여 등록하면, DefaultAnnotationHandlerMapping 을 통해 컨트롤러로 사용이 되는 것이다.

 

이제는 @RequestMapping 어노테이션을 이용한 요청 매핑에 대해서 알아보자.

@RequestMapping 어노테이션은 컨트롤러가 처리할 요청 URL 을 명시하는데 사용되며, 클래스나 메서드에 적용된다.

@RequestMapping 을 클래스에 적용하지 않고 메서드에만 적용할 경우 각각의 메서드가 처리할 요청 URL 을 명시하게 된다.

@Controller
public class RequestController {

    @RequestMapping("/test/mapping1.do")
    public String mappingFirst(@RequestParam("id") String id, @RequestParam("pwd") String pwd, ModelMap modelMap) {
        // 로직 처리와 리턴 구문
    }

    @RequestMapping("/test/mapping2.do")
    public String mappingSecond(@RequestParam("id") String id, @RequestParam("pwd") String pwd, ModelMap modelMap) {
        // 로직 처리와 리턴 구문
    }
    ...
}

다수의 메서드에 @RequestMapping 을 적용하면, MultiActionController 처럼 한 개의 컨트롤러에서 다수의 요청을 처리할 수가 있다.

그리고 @RequestMapping 의 method 엘리먼트를 이용하면 처리할 수 있는 Http Method 를 지정할 수도 있다.

@RequestMapping(value="/test/mapping1.do", method=RequestMethod.POST)
public String mappingSomething(...) {...}

@RequestMapping 을 클래스 타입에 적용하게 되면, 해당 컨트롤러 클래스는 지정한 URL 만을 처리할 수 있다.
이 경우 메서드에 적용되는 @RequestMapping 은 더 이상 URL 명시를 할 수 없고, method, params 엘리먼트만 지정할 수 있게 된다.


출처 : http://northface.tistory.com/

728x90
728x90

1. jQuery로 선택된 값 읽기

 

$("#selectBox option:selected").val();

$("select[name=name]").val();

 

2. jQuery로 선택된 내용 읽기

 

$("#selectBox option:selected").text();

 

3. 선택된 위치

 

var index = $("#test option").index($("#test option:selected"));

 

4. Add options to the end of a select

 

$("#selectBox").append("<option value='1'>Apples</option>");

$("#selectBox").append("<option value='2'>After Apples</option>");

 

5. Add options to the start of a select

 

$("#selectBox").prepend("<option value='0'>Before Apples</option>");

 

6. Replace all the options with new options

 

$("#selectBox").html("<option value='1'>Some oranges</option><option value='2'>MoreOranges</option>");

 

7. Replace items at a certain index

 

$("#selectBox option:eq(1)").replaceWith("<option value='2'>Someapples</option>");

$("#selectBox option:eq(2)").replaceWith("<option value='3'>Somebananas</option>");

 

8. 지정된 index값으로 select 하기

 

$("#selectBox option:eq(2)").attr("selected", "selected");

 

9. text 값으로 select 하기

 

$("#selectBox").val("Someoranges").attr("selected", "selected");

 

10. value값으로 select 하기

 

$("#selectBox").val("2");

 

11. 지정된 인덱스값의 item 삭제

 

$("#selectBox option:eq(0)").remove();

 

12. 첫번째 item 삭제

 

$("#selectBox option:first").remove();

 

13. 마지막 item 삭제

 

$("#selectBox option:last").remove();

 

14. 선택된 옵션의 text 구하기

 

alert(!$("#selectBox option:selected").text());

 

15. 선택된 옵션의 value 구하기

 

alert(!$("#selectBox option:selected").val());

 

16. 선택된 옵션 index 구하기

 

alert(!$("#selectBox option").index($("#selectBox option:selected")));

 

17. SelecBox 아이템 갯수 구하기

 

alert(!$("#selectBox option").size());

 

18. 선택된 옵션 앞의 아이템 갯수

 

alert(!$("#selectBox option:selected").prevAl!l().size());

 

19. 선택된 옵션 후의 아이템 갯수

 

alert(!$("#selectBox option:selected").nextAll().size());

 

20. Insert an item in after a particular position

 

$("#selectBox option:eq(0)").after("<option value='4'>Somepears</option>");

 

21. Insert an item in before a particular position

 

$("#selectBox option:eq(3)").before("<option value='5'>Someapricots</option>");

 

22. Getting values when item is selected

 

$("#selectBox").change(function(){

           alert(!$(this).val());

           alert(!$(this).children("option:selected").text());

});


728x90
728x90


2. 스프링 DI (빈 생성과 의존 관계 설정)  스프링 2.5 / = Study = 

2010.05.11. 17:45

복사http://blog.naver.com/chocolleto/30085911267

번역하기 전용뷰어 보기

2. 빈(Bean) 생성과 의존 관계 설정

  □ 빈 생성 및 사용
    ■ <bean>태그를 이용하여 생성할 빈 객체에 대한 정보 설정.
      ○ <bean> 태그
        - 스프링 컨테이너가 관리할 빈 객체를 생성.
 <?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-2.0.xsd">

    <bean id="articleDao" class="kame.spring.chap02.MysqlArticleDao">
    </bean>

 </beans>
      ○ <bean> 태그 속성
        - class : 생성할 빈 객체의 완전한 클래스 이름.
        - id : 스프링 컨테이너에서 생성된 객체를 구분하는데 사용되는 식별값. (name 속성을 사용해도 됨.)
    ■ 컨테이너로부터 빈 객체를 가져와 사용
 Resource resource = new ClassPathResource("applicationContext.xml");
 // 스프링 컨테이너 생성
 BeanFactory beanFactory = new XmlBeanFactory(resource);
 // 스프링 컨테이너로부터 빈 객체를 가져와 사용
 MysqlArticleDao articleDao = (MysqlArticleDao)beanFactory.getBean("articleDao");
      - 식별값(id속성 또는 name 속성)을 getBean() 메서드에 전달해서 컨테이너로부터 객체를 가져올 수 있음.
    ■ 주의 사항
      - <bean> 태그에 생성자와 관련된 정보(<constructor-arg>태그)를 명시하지 않았다면, 스프링은 파라미터가 없는 기본 생성자를
         이용하여 객체를 생성.
      - 빈으로 사용할 클래스에 파라미터를 갖는 생성자를 정의했다면 기본 생성자도 함께 정의.
 public class MysqlArticleDao implements ArticleDao {
    // 파라미터를 갖는 생성자가 정의되어 있는 경우, 기본 생성자 추가해야 함.
    public MysqlArticleDao() {}

    public MysqlArticleDao(DataSource dataSource) {
        .......
    }
 }
    ■ 빈 팩토리 메서드
      ○ 생성자가 아닌 static 메서드를 이용하여 객체를 생성해야 하는 경우.
 // 싱글톤 패턴이 적용된 클래스.
 public class ParserFactory {
    private static ParserFactory instance = new ParserFactory();

    public static ParserFactory getInstance() {
        return instance;
    }

    // 기본 생성자 접근 막음.
    private ParserFactory() {}
    .......
 }
      ○ <bean> 태그에 factory-method 속성값으로 static 메서드를 지정
        - 해당 메서드를 이용하여 빈을 생성하도록 설정.
 <bean id="parserFactory" class="kame.spring.chap02.ParserFactory"
    factory-method="getInstance" />
        - factory-method 속성을 지정하면 스프링 컨테이너는 생성자를 사용하지 않고 getInstance()메서드를 이용하여 ParserFactory
          클래스의 객체를 구함.

  □ 의존 관계 설정
    - 스프링 컨테이너에서 각 객체 간의 의존 관계도 XML 파일을 통해 명시 가능.
    ■ 생성자 방식
      - 의존하는 객체를 생성자를 통해 전달 받음.
      ○ 의존 관계
        - WriteArticleServiceImpl 클래스는 ArticleDao 인터페이스에 의존.
      ○ 생성자를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl {
    private ArticleDao articleDao;

    public WriteArticleServiceImpl(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }

    public void write(Article article) {
        ...
        articleDao.insert(article);
    }
 }
      ○ <constructor-arg> 태그
        ● 특징
          - 생성자를 통해서 의존하는 객체를 전달 받는 경우, <constructor-arg> 태그를 이용하여 의존하는 객체를 전달 할 수 있음.
          - 스프링은 <constructor-arg> 태그를 통해 전달된 값의 타입과 가장 근접한 파라미터를 갖는 생성자를 이용하여 객체를 생성.
        ● <constructor-arg> 태그를 이용한 생성자 방식의 설정
 <!-- WriteArticleServiceImpl 클래스의 생성자에 식별값이 "articleDao"인 빈 객체를 전달.-->
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg>
        <ref bean="articleDao">
    </constuctor-arg>
 </bean>

 <bean id="articleDao" calss="kame.spring.chap02.OracleArticleDao">
 </bean>
 // 코드로 표현
 OracleArticleDao articleDao = new OracleArticleDao();
 WriteArticleServiceImpl writeArticleService = new WriteArticleServiceImpl(articleDao);
         - <ref> 태그는 레퍼런스(reference)를 의미.
         - <ref> 태그 대신에 <constructor-arg> 태그의 ref 속성을 사용하여 지정 가능.
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg ref="articleDao" />
 </bean>
        ● 생성자가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <ref> 태그 대신에 <value> 태그를 사용하여 값을 지정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg>
        <value>10</value>
    </constructor-arg>
 </bean>
         - <value> 태그 대신에 <constructor-arg> 태그의 value속성을 사용하여 지정 가능.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
 </bean>
        ● 생성자가 전달받는 파라미터가 2개 이상인 경우
          - 파라미터 개수 만큼 <constructor-arg> 태그 설정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
    <constructor-arg ref="sender" />
 </bean>
      ○ 예제
        - 두 개의 생성자를 갖는 클래스 설정.
        ● 두 개의 생성자를 갖는 클래스
 public class JobExecutor {
    pubilc JobExecutor(Runnable run) {
        ....
    }

    public JobExecutor(Job job) {
        ....
    }
 }
        ● Job 클래스
          - Runnalbe 인터페이스를 상속받은 인터페이스.
 public interface Job extends Runnable {
    ....
 }
        ● SomeRunnable 클래스
          - Runable 인터페이스를 구현한 클래스.
 public class SomeRunnable implements Runnable {
    ....
 }
        ● 스프링 설정 파일
 <bean name="run" class="kame.SomeRunnable" />
 <bean name="job" class="kame.Job" />

 <bean name="executor1" class="kame.JobExecutor">
    <constructor-arg ref="run" />
 </bean>

 <bean name="executor2" class="kame.JobExecutor">
    <constructor-arg ref="job" />
 </bean>
         - executor1 빈을 생성할 때에는 Runnable(SomeRunnable의 타입이 Runnable이므로)을 전달받는 JobExecutor 생성자 사용.
         - executor2 빈을 생성할 때에는 Job을 전달받는 JobExecutor 생성자 사용.
      ○ 예제
        - 두 개 이상의 생성자에서 기본 데이터 타입이나 래퍼 타입을 사용하여 생성하는 클래스 설정.
        ● 세 개의 생성자를 제공하는 클래스
 public class JobExector {
    public JobExecutor(String name, int seconds) { ... }
    public JobExecutor(String name, long millis) { ... }
    public JobExecutor(String name, String seconds) { ... }
 }
        ● 스프링 설정 파일1
 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value>3000</value>
    </constructor-arg>
 </bean>

         - 스프링은 기본적으로 <value>에 전달된 값을 java.lang.String 타입으로 처리.
         - 두 번째 파라미터가 String 타입인 생성자를 사용해서 객체를 생성.
         - 만약 매칭되는 파라미터 타입이 String인 생성자가 존재하지 않을 경우 <value>에 전달된 값에 따라 두 번째 파라미터가 알맞는

           데이터 타입인 int인 생성자가 사용.
        ● 스프링 설정 파일2

 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value type="long">3000</value>
    </constructor-arg>
 </bean>
         - <value> 태그에 type 속성을 추가하면 직접 매칭될 파라미터의 타입을 명시 가능.
         - <value> 태그뿐만 아니라 <constructor-arg> 태그에 type속성을 추가해도 동일한 동작을 함.
    ■ 프로퍼티 설정 방식
      - setXXXX() 형태의 설정 메서드를 통해서 필요한 객체와 값을 전달 받음.
        (setXXXX() 형태의 메서드에서 프로퍼티의 이름은 XXXX가 됨.)
      ○ 설정 메서드를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl implements WriteArticleService {
    private ArticleDao articleDao;

    public void setArticleDao(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }
 }
      ○ <property> 태그
        - 프로퍼티에 값을 전달.
        ● <property> 태그를 이용한 프로퍼티 값 설정
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="mysqlArticleDao" />
    </property>
 </bean>
          - <property> 태그에서도 <ref> 태그를 이용하여 빈 객체를 프로퍼티의 값으로 전달할 수 있음.
        ● 설정 메소드가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <value> 태그를 사용하여 설정.
 <bean name="lockingFailManager" class="kame.spring.chap02.PessimisticLockingFailManager">
    <property name="retryCount">
        <value>3</value>
    </property>
 </bean>
        ● 빈 객체와 기본 데이터 타입값 전달
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>
    ■ XML 네임스페이스를 이용한 프로퍼티 설정
      - XML 네임스페이스를 이용하면 <property> 태그를 사용하지 않고 좀 더 간단한 방법으로 프로퍼티의 값 설정 가능.
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:p="http://www.springframework.org/schema/p"
     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="monitor" class="kame.spring.chap02.SystemMonitor"
        p:periodTime="10" 
        p:sender-ref="smsSender" />

    <bean id="smsSender" class="kame.spring.chap02.SmsSender" />
 </beans>
         - 접두어 "p"를 사용하여 프로퍼티 값 설정.
         - 기본 데이터 타입 설정 : "p:프로퍼티이름" 속성을 사용하여 프로퍼티 값을 설정.
         - 빈 객체를 프로퍼티에 전달 : "p:프로퍼티이름-ref" 속성을 사용.
    ■ 임의 빈 객체 전달
      - 식별 값을 갖지 않는 빈 객체를 생성해서 전달 가능.
      - <constructor-arg> 태그나 <property> 태그에 <bean> 태그를 중첩해서 사용.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor"
     p:periodTime="10">
    <property name="sender">
        <!-- 임의 빈 객체 -->
        <bean class="kame.spring.chap02.SmsSender">
            <constructor-arg value="true" />
        </bean>
     </property>
 </bean>
         - 임의 빈 객체는 식별 값을 갖지 않기 때문에 임의 빈 객체를 재사용할 수 없음. (식별값을 준다하더라도 사용할 수 없음.)

  □ 컬렉션 타입 프로퍼티 설정
    ■ 컬렉션 타입을 입력받기 위한 스프링 태그
    ■ List 타입과 배열
      ○ 특징
        - java.util.List 타입의 프로퍼티나 생성자 인자에 값 목록을 전달.
        - <list> 태그 사용
      ○ 설정 방법
 public class ProtocolHandler {
    private List<Filter> filters;

    public void setFilters(List<Filter> filters) {
        this.filters = filters;
    }
    ......
 }
 <bean name="handler" class="kame.spring.chap02.ProtocolHandler">
    <property name="filters">
        <list>
            <ref bean="encryptionFilter" />
            <ref bean="zipFilter" />
            <bean class="kame.spring.chap02.HeaderFilter" />
        </list>
    </property>
 </bean>

 <bean name="zipFilter"class="kame.spring.chap02.ZipFilter" />
 <bean name="encryptionFilter" class="kame.spring.chap02.EncryptionFilter" />
      ○ <list> 태그
        - List에 저장된 객체 목록을 <ref> 태그를 이용하여 전달 받음.
        - <bean> 태그를 이용하여 식별 값을 갖지 않는 임의 객체를 List에 전달 가능.
      ○ List에 저장되는 값이 래퍼 타입이거나 String 타입일 경우
        - <value> 태그를 사용하여 값 전달.
        - <list> 태그의 value-type 속성을 이용하여 List에 저장될 값들의 타입 명시 가능.
        - <value> 태그에 type 속성을 이용해도 List에 저장될 값들의 타입 명시 가능.
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- <value> 태그에 명시된 값은 String 타입으로 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 public class PerformanceMonitor {
    private List deviations;

    public setDeviations(List deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value-type 속성을 이용하여 Double 타입으로 처리. -->
        <list value-type="java.lang.Double">
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value 태그의 type 속성을 이용하여 Double 타입으로 처리. -->
        <list>
            <value type="java.lang.Double">0.2</value>
            <value type="java.lang.Double">0.3</value>
        </list>
    </property>
 </bean>
      ○ Generic 을 이용할 경우
        - <list>나 <value>태그에 값의 타입을 명시하지 않아도 알맞게 타입을 변환.
 public class PerformanceMonitor {
    private List<Double> deviations;

    public setDeviations(List<Double> deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- 제너릭을 사용한 경우, 알맞게 타입 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
      ○ List에 저장될 값을 표현하기 위해 사용 가능한 태그
        - <ref> : 다른 스프링 빈 객체를 값으로 사용.
        - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
        - <value> : 래퍼 타입이나 String을 값으로 사용.
        - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
        - <null> : null 값을 값으로 사용.
      ○ 배열
        - <list> 태그는 배열을 설정할 때도 사용.
 public class ProtocolHandler {
    private Filter[] filters;

    public void setFilters(Filter[] filters) {
        this.filters = filters;
    }
    ......
 }
        - <list> 프로퍼티를 이용해서 값 전달.
    ■ Map 타입
      ○ 특징
        - java.util.Map 타입의 프로퍼티를 설정.
        - <map> 태그 사용.
      ○ 설정 방법
 public class ProtocolHandlerFactory {
    private Map<String, ProtocolHandler> handlers;

    public void setHandlers(Map<String, ProtocolHandler> handlers) {
        this.handlers = handlers;
    }
    .......
 }
 <bean name="handlerFactory" class="kame.spring.chap02.ProtocolHandlerFactory">
    <property name="handlers">
        <map>
            <entry>
                <key><value>soap</value></kay>
                <ref bean="soapHandler" />
            </entry>
            <entry>
                <kay><value>rest</value></kay>
                <ref bean ="restHandler" />
            </entry>
        </map>
    </property>
 </bean>
      ○ <entry> 태그
        - 한 개의 <entry> 태그는 Map에 저장될 한 개의 <키, 값>을 표현.
        - 두 개의 자식 노드를 가지며, 각각 키와 값을 의미.
 <map>
    <entry>
        <kay><키태그>...</키태그></key>
        <값태그>...</값태그>
    </entry>
 </map>
        ● <키태그>와 <값태그>에 지정할 수 있는 태그
          - <ref> : 다른 스프링 빈 객체를 키로 사용.
          - <bean> : 임의 빈 객체를 생성해서 키로 사용.
          - <value> : 래퍼 타입이나 String을 키로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 키로 사용.
          - <null> : null 값을 키로 사용.
      ○ 예제
 <map>
    <!-- 키와 값의 타입이 각각 String과 Integer일 경우 지정.-->
    <entry>
        <key><value>1</value></key>
        <value type="java.lang.Integer">1th</value>
    </entry>
    <!-- 빈 객체를 참조할 경우 <ref> 태그를 이용하여 지정. -->
    <entry>
        <key><ref bean="protocol"></key>
        <ref bean="handler" />
    </entry>
 </map>
      ○ <entry> 태그의 속성을 이용하여 표현
        - key, key-ref, value, value-ref 속성을 이용하여 <키, 값> 쌍을 좀 더 간단히 표현.
 <!-- 위 코드와 동일 -->
 <map>
    <entry key="1" value="1th" />
    <entry key-ref="protocol" value-ref="handler" />
 </map>
        - 래퍼 타입이나 String 타입을 키나 값에 할당할 때에는 key 속성과 value 속성을 사용.
        - 빈 객체를 참조할 때에는 key-ref나 value-ref를 사용하여 설정.
      ○ 제러닉을 사용하지 않은 상태에서의 래퍼 타입의 키나 값 설정
        - key-type 속성과 value-ref 속성을 이용하여 키와 값의 타입을 지정.
 <property name="ratio">
    <map key-type="java.lang.Integer" value-type="java.lang.Double">
        <entry ... />
        ......
    </map>
 </property>
    ■ Properties 타입
      ○ 특징
        - java.util.Properties 타입의 프로퍼티 설정.
          (Properties 클래스는 환경변수나 설정 정보와 같이 상황에 따라 변경 되는 값을 저장하기 위한 용도로 사용.)
        - <props> 태그 이용.
      ○ 설정 방법
 <bean name="client" class="kame.spring.chap02.BookClient">
    <property name="config">
        <props>
            <prop key="servier">192.168.1.100</prop>
            <prop key="connectionTimeout">5000</prop>
        </props>
    </property>
 </bean>
         - 프로퍼티 이름 : "server"와 "connectionTimeout"
         - 프로퍼티의 값 : "192.168.1.100"과 ."5000"
      ○ <prop> 태그
        - 한 개의 프로퍼티를 표현.
        - 프로퍼티의 이름은 key 속성을이용하여 입력.
        - 프로퍼티의 값은 <prop>태그의 몸체 내용을 이용하여 입력.
        - 한 개의 <prop> 태그는 Properties 태그에 한 개의 프로퍼티로 저장.
          (Properties.getProperty(String name)메서드를 이용하여 프로퍼티 값을 사용.)
 public class BookClient {
    private Properties config;

    public void setConfig(Properties config) {
        this.config = config;
    }

    public void connect() {
        String serverIp = config.getProperty("servier");
        ......
    }
 }
    ■ Set 타입
      ○ 특징
        - java.util.Set 타입의 프로퍼티를 설정.
        - <set>태그를 이용.
      ○ 설정방법
 <property name="subset">
    <set value-type="java.lang.Integer">
        <value>10</value>
        <value>20</value>
        <value>30</value>
    </set>
 </property>
      ○ <set> 태그
        - 집합에 저장될 값을 <value> 태그나 <ref> 등의 태그를 이용하여 표시.
        - 래퍼 타입인 경우 <list>나 <map>의 경우처럼 value-type 속성을 이용하여 저장될 값의 타입을 명시.
          (<value>태그의 type 속성도 이용 가능.)
        ● 값을 지정할 수 있는 태그
          - <ref> :  다른 스프링 빈 객체를 값으로 사용.
          - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
          - <value> : 래퍼 타입이나 String을 값으로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
          - <null> : null 값을 값으로 사용.

  □ 의존 관계 자동 설정
    ■ 빈 객체 간의 의존 관계 설정
      - <property> 태그를 이용하여 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="articleDao" />
    </property>
 </bean>

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao">
 </bean>
         - writeArticleService 빈 객체에서 articleDao 객체로의 하나의 의존 관계만을 포함.
    ■ 의존관계 자동 설정
      - 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정할 수 있는 기능 제공.
        (설정 파일의 크기를 줄일 수 있음.)
      - 자동 설정과 관련하여 별도의 설정을 하지 않으면 자동 설정을 사용하지 않게 됨.
      ○ 자동설정 방식
      ○ 특정 방식을 이용하여 의존 객체 설정
        - <bean> 태그에 autowire 속성을 값을 알맞게 지정.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor" autowire="byName" />
        ● autowire 속성
          - 기본 값 : default (default-autowire 속성의 값을 사용.)
      ○ 설정 파일에 포함된 모든 빈 객체에 대해서 특정 방식의 자동 설정 적용
        - <beans> 태그의 default-autowire 속성의 값에 설정 방식을 지정.
 <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-2.0.xsd"
     default-autowire="byName">
    ....
 </beans>
        ● default-autowire 속성
          - 기본 값 : no (자동 설정 하지 않음.)
    ■ 프로퍼티 이름을 이용한 의존 관계 자동 설정
      ○ 특징
        - byName 방식.
        - 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl
     autowire="byName" />

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao" />
 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - WriteArticleServiceImpl 클래스가 이름이 "articleDao"인 프로퍼티를 갖고 있다면, 이름이 "articleDao"인 빈 객체가 프로퍼티의
           값으로 전달됨.
      ○ 단점
        - 코드를 리팩토링해서 프로퍼티의 이름을 변경하는 경우 기존에 올바르게 동작하던 설정 파일이 올바르게 동작하지 않을 수도
          있음.
    ■ 프로퍼티 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - byType 방식.
        - 프로퍼티의 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byType" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - articleDao 프로퍼티에 알맞은 빈 객체 설정.
      ○ 단점
        - 프로퍼티 타입과 동일한 타입의 빈 객체를 오직 1개만 설정 가능. 
          (동일한 타입의 빈 객체가 두 개 이상 존재하게 되면 스프링은 어떤 빈 객체를 사용해야 할 지 알 수 없기 때문에 예외 발생.)
    ■ 생성자 파라미터 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - constructor 방식.
        - byType 방식처럼 타입을 이용하여 값을 전달. (차이점 : 프로퍼티가 아닌 생성자의 파라미터 타입 사용.)
      ○ 설정 방법
 public class WriteArticleSerivceImpl {
    public WriteArticleServiceImpl(ArticleDao articleDao) {
        .........
    }
 }
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="constructor" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />

         - WriteArticleServiceImpl(ArticleDao articleDao) 생성자의 첫 번째 파라미터에 ArticleDao 타입인 mysqlArticleDao 빈 객체가

           전달됨.
      ○ 단점
        - 생성자 파라미터 타입과 일치하는 빈 객체가 2개 이상 존재할 경우 빈 객체를 생성할 때 예외를 발생시킴.
    ■ 생성자 및 프로퍼티 타입을 이용한 자동 설정
      ○ 특징
        - autodetect 방식.
        - constructor 방식을 먼저 적용하고, constructor 방식을 적용할 수 없는 경우 byType 방식을 적용하여 의존 객체를 설정.
      ○ 설정 방법

 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="autodetect" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
      ○ 단점
        - constructor 방식과 byType 방식을 사용하므로, 동일한 타입의 빈 객체를 2개 이상 정의 할 수 없음.
    ■ 자동 설정과 직접 설정의 혼합
      ○ 특징
        - 자동 설정과 함께 <property> 태그를 이용하여 해당 프로퍼티의 값을 직접 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener" ref="emailAdaptor" />
 </bean>
      ○ 특정 프로퍼티의 값이 자동 설정에 의해 초기화되지 않게 할 경우
        - <null> 태그를 이용하여 프로퍼티의 값을 null로 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener"><null/></property>
 </bean>


  □ 부모 빈을 통한 설정 재사용
    - 중복되는 설정을 갖는 빈이 다수 존재할 경우, 중복되는 설정 정보를 담고 있는 부모 빈을 정의한 뒤, 부모 빈 정보를 재사용하도록

      설정.
    ■ 설정 재사용 전

 <bean id="doorMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="lobbyMonitor" class="kame.spirng.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="roomMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="20" />
    <property name="sender" ref="smsSender" />
 </bean>
         - 빈의 이름만 다를 뿐 나머지 설정은 대부분 동일.
    ■ 부모 빈으로부터 설정 정보 상속
 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="doorMonitor" parent="commonMonitor" />
 <bean id="lobbyMonitor" parent="commonMonitor" />
 <bean id="roomMonitor" parent="commonMonitor">
    <property name="periodTime" value="20" />
 </bean>

      ○ commonMonitor 빈
        - 빈 클래스를 비롯하여 프로퍼티 설정 등이 포함.
        - abstract="true" : 해당 빈 객체를 생성하지 않음.
        - 설정 정보만 존재할 뿐 실제로 객체는 생성되지 않음.
      ○ 자식 빈
        - parent 속성을 사용하여 클래스 및 프로퍼티 설정 정보를 물려받을 부모빈을 설정.
        - parent 속성을 이용하여 물려받은 설정 정보 중에서 변경하고 싶은 값이 있다면 추가로 입력.
        - 프로퍼티뿐만 아니라 클래스도 새롭게 지정 가능.
    ■ 자식 빈에 class 속성 이용하여 클래스 새롭게 지정
      - class 속성 이용하여 클래스를 새롭게 지정하면 부모 빈에서 설정한 클래스가 아닌 class 속성에 명시한 클래스를 사용하여 빈을

        생성.

 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <!-- commonMonitor 빈의 프로퍼티 정보를 사용. -->
 <bean id="extMonitor" parent="commonMonitor" class="ExtendedSystemMonitor">
    <property name="defaultResolution" value="high" />
 </bean>
 <!-- 위와 동일 -->
 <bean id="extMonitor" class="ExtendedSystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
    <property name="defaultResolution" value="high" />
 </bean>


728x90

'프로그래밍 > java' 카테고리의 다른 글

poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
에러코드 정리  (0) 2016.05.25
에자일 방법론  (0) 2016.03.29
java.lang.UnsupportedClassVersionError  (0) 2016.03.28
java 윤년, 평년 구분하기  (0) 2016.01.18

+ Recent posts