spring IOC 용기 실례 화 Bean 방식 과 RequestContextListener 응용

 <!--Spring ApplicationContext    -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!--  Spring  request session scope, :<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> -->
	<listener>
	  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>

	<!-- Spring   Introspector       -->
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>

웹 애플 리 케 이 션 Context 가 초기 화 되 었 을 때, 우 리 는 ContextLoaderListener 를 통 해 웹 용기 와 spring 용 기 를 통합 시 켰 습 니 다. 왜 여기에 빈 의 다른 3 개의 역할 영역 을 지원 하기 위해 추가 RequestContextListener 를 도입 합 니까?
spring 용 기 를 통합 할 때 ContextLoader Listener 를 사용 하여 ServletContextListener 모니터 인 터 페 이 스 를 실현 합 니 다.ServletContextListener 는 웹 용기 의 시작 과 닫 힌 이벤트 만 감청 합 니 다.
한편, Request ContextListener 는 ServletRequestListener 모니터 인 터 페 이 스 를 실현 합 니 다. 이 모니터 는 HTTP 요청 이 벤트 를 감청 하고 웹 서버 가 받 은 모든 요청 을 감청 기 에 알 립 니 다.
spring 용기 의 시작 과 닫 기 동작 은 웹 용기 의 시작 과 닫 기 에 의 해 촉발 되 지만, spring 용기 에 있 는 bean 이 request, session, globalsession 의 지원 이 필요 하 다 면 spring 용기 자체 가 웹 용기 의 HTTP 요청 이 벤트 를 받 아야 합 니 다. HTTP 요청 이벤트 로 Bean 을 구동 하 는 제어 논리 입 니 다.
 
spring IOC 용기 실례 화 Bean 의 방식 은 다음 과 같다.
singleton spring IOC 용기 에 빈 인 스 턴 스 만 존재 합 니 다. 빈 은 하나의 인 스 턴 스 로 존재 합 니 다.
spring 은 용기 의 방식 으로 천연 단일 인 스 턴 스 모드 기능 을 제공 합 니 다. 어떤 POJO 도 특별한 코드 를 만 들 필요 가 없습니다. 설정 만으로 도 됩 니 다.
메모: spring 은 Bean 의 기본 역할 영역 을 singleton 으로 정 합 니 다.
기본적으로 spring 의 applicationContext 용기 가 시 작 될 때 모든 singleton 의 Bean 을 자동 으로 예화 하고 용기 에 캐 시 합 니 다.
시작 하 는 데 시간 이 좀 걸 리 지만 두 가지 장점 을 가 져 옵 니 다.
우선 Bean 에 대한 사전 실례 화 작업 은 잠재 적 인 설정 문 제 를 일찍 발견 할 수 있 습 니 다.
그 다음 에 Bean 은 캐 시 방식 으로 저장 합 니 다. 실행 할 때 이 Bean 을 사용 할 때 더 이상 예화 할 필요 가 없고 운행 효율 을 가속 화 합 니 다.
사용자 가 용기 가 시 작 될 때 singleton 의 Bean 을 미리 예화 하지 않 으 려 면 lazy - init 속성 을 통 해 제어 할 수 있 습 니 다.
<bean id="boos1" class="com.baobaotao.scope.Boss" lazy-init="true">

      <property name="car" ref="car"/>

</bean>

lazy - init = "true" 의 Bean 은 어떤 경우 에 도 미리 실례 화 됩 니 다. 이 Bean 이 미리 실례 화 되 어야 할 다른 Bean 에 의 해 인용 된다 면,
spring 도 지연 실례 화 설정 을 무시 합 니 다.
 
prototype 용기 에서 Bean 을 호출 할 때마다 getBean () 을 호출 할 때마다 new XxBean () 을 실행 하 는 것 과 같은 새로운 인 스 턴 스 를 되 돌려 줍 니 다.
scope = "prototype" 을 사용 하여 비 단일 인 스 턴 스 역할 영역 Bean 을 지정 합 니 다. 보 세 요:
<bean id="car" class="com.baobaotao.scope.Car" scope="prototype"/>

<bean id="boss1" class="com.baobaotao.scope.Boss">

     <property name="car" ref="car"/>

</bean>

<bean id="boss2" class="com.baobaotao.scope.Boss">

     <property name="car" ref="car"/>

</bean>

boss 1, boss 2 가 인용 한 것 은 모두 독립 된 Car 인 스 턴 스 입 니 다.
기본적으로 spring 용 기 는 시작 할 때 prototype 의 Bean 을 예화 하지 않 습 니 다. 또한, spring 용 기 는 prototype 의 Bean 을 호출 자 에 게 건 네 준 후 수명 주 기 를 관리 하지 않 습 니 다.
 
request HTTP 요청 이 있 을 때마다 새 Bean 을 만 듭 니 다. 이 역할 영역 은 웹 응용 프로그램 Context 환경 에 만 적 용 됩 니 다.
말 그대로 request 역할 필드 의 Bean 은 HTTP 요청 과 수명 주기 에 대응 합 니 다.
이렇게 HTTP 가 car Bean 으로 호출 을 요청 할 때마다 spring 용기 에 새 Car Bean 을 만 들 고 처리 가 완료 되면 이 Bean 을 소각 합 니 다.
 
session 같은 HTTP session 은 하나의 Bean 을 공유 합 니 다. 서로 다른 HTTP session 은 서로 다른 Bean 을 사용 합 니 다. 이 역할 도 메 인 은 webapplicationContext 환경 에 만 적 용 됩 니 다.
상기 car 의 역할 영역 을 session 형식 으로 조정 한다 고 가정 합 니 다.
<bean name="car" class="com.baobaotao.scope.Car" scope="session"/>

이렇게 설정 하면 car Bean 의 역할 영역 이 전체 HTTP session 에 걸 쳐 있 습 니 다. session 의 모든 HTTP 요청 은 같은 Car Bean 을 공유 합 니 다. HTTP Session 이 끝 난 후에 야 인 스 턴 스 가 삭 제 됩 니 다.
 
globalSession 같은 전역 session 에서 빈 을 공유 합 니 다. 일반적으로 portlet 응용 환경 에 사 용 됩 니 다. 이 역할 도 메 인 은 webapplicationContext 환경 에 만 적 용 됩 니 다.
globalSession 역할 도 메 인 은 session 역할 도 메 인 과 유사 하지만 portlet 의 웹 응용 에서 만 사용 합 니 다. Portlet 규범 은 전역 Session 개념 을 정의 합 니 다. portlet 웹 응용 프로그램의 모든 하위 portlet 공유 로 구성 되 어 있 습 니 다. Portlet 웹 응용 환경 에서 만 사용 되 지 않 으 면 globalSession 은 자연히 session 에 도 메 인 이 됩 니 다.
 

좋은 웹페이지 즐겨찾기