Spring 학습 자료 - 주입 의존 (4)
1.3.5 범위 (역할 영역)
1.1 장 에서 우 리 는 대상 의 단일 사례 모델 을 초보 적 으로 이 해 했 고 Guice 에서 흔히 볼 수 있 는 역할 도 메 인 을 제공 했다. 예 를 들 어 단일 사례 모델 에 다음 과 같은 두 가지 역할 도 메 인 이 있다.
com.google.inject.Scopes.SINGLETON
com.google.inject.Scopes.NO_SCOPE
사용 에 있어 서 Module 의 bid 를 사용 하여 실현 할 수 있 습 니 다. 아래 의 예 를 보 세 요.
1 public class ScopeDemo {
2 public static void main(String[] args) {
3
4 Service service = Guice.createInjector(new Module() {
5 @Override
6 public void configure(Binder binder) {
7 binder.bind(Service.class).to(WwwService.class).in(Scopes.SINGLETON);
8 }
9 }).getInstance(Service.class);
10 service.execute();
11 }
12 }
13
14
물론 단일 모드 는 @ Singleton 으로 설명 할 수 있 습 니 다.
com. google. inject. binder. scoped Binding Builder. in (Scope) 방법 에서 하나의 Scope 는 위의 SINGLETION 과 NO 를 제외 하고SCOPE 외 에 자신 이 정의 한 Scope 일 수도 있다.다음 예 는 스 레 드 와 연 결 된 Scope 예 를 보 여 줍 니 다.
1 /**
2 * $Id: ThreadScopeDemo.java
3 * teny study project (www.teny32.blog.51cto.com)
4 */
5 package cn.imxylz.study.guice.inject.more;
6
7 import com.google.inject.Binder;
8 import com.google.inject.Guice;
9 import com.google.inject.Injector;
10 import com.google.inject.Key;
11 import com.google.inject.Module;
12 import com.google.inject.Provider;
13 import com.google.inject.Scope;
14
15 /** a demo with thread-scope
16 * @author Teny (www.teny32.blog.51cto.com)
17 * @version 1.0
18 */
19 public class ThreadScopeDemo {
20
21 static class ThreadServiceScope implements Scope {
22
23 static ThreadLocal
여기 에는 'Google Guice 입문 강좌 03 - 주입 의존' 의 두 가지 서비스 와 WwService 가 사 용 됩 니 다.이 예 에서 ThreadServiceScope 류 는 스 레 드 와 연 결 된 역할 영역 (ThreadLocal 특성 이용) 입 니 다. 현재 스 레 드 에 대상 을 구성 하지 않 았 을 때 먼저 하 나 를 구성 한 다음 스 레 드 컨 텍스트 에 넣 고 나중에 스 레 드 에서 대상 을 가 져 옵 니 다.50 번 째 줄 은 WwwService 서 비 스 를 ThreadServiceScope 의 역할 영역 으로 Service 서비스 에 연결 하 는 것 입 니 다.57 - 60 줄 에서 현재 대상 의 hashCode 를 출력 합 니 다. 같은 대상 이 라면 같은 hashCode 를 출력 해 야 합 니 다.효 과 를 보기 위해 서 우 리 는 세 개의 스 레 드 를 사용 하여 스 레 드 마다 세 번 출력 하여 결 과 를 봅 니 다.
Thread-0-0:18303751
Thread-1-0:23473608
Thread-2-0:21480956
Thread-1-1:23473608
Thread-0-1:18303751
Thread-2-1:21480956
Thread-1-2:23473608
Thread-2-2:21480956
Thread-0-2:18303751
우 리 는 같은 스 레 드 (예 를 들 어 Thread - 0) 에 대한 세 번 모두 같은 대상 (hashCode 는 18303751) 을 출력 한 것 을 보 았 으 며, 스 레 드 2 와 스 레 드 3 의 hashCode 와 다르다.
(특히 두 스 레 드 가 같은 hashCode 를 출력 했다 면 당황 하지 않 아 도 됩 니 다. 이전 스 레 드 가 생 성 된 대상 의 주소 공간 이 GC 에 의 해 방출 될 수 있 기 때 문 입 니 다. 그 결과 다음 스 레 드 는 이전 스 레 드 의 같은 공간 을 사 용 했 기 때문에 여 기 는 Thread. sleep 를 사용 하여 이러한 가능성 을 낮 춥 니 다)
사실 guice - servlet - 2.0. jar 에는 request 와 session 과 연 결 된 scope 가 있 습 니 다.
com.google.inject.servlet.ServletScopes.REQUEST
com.google.inject.servlet.ServletScopes.SESSION
1.3.6 Eagerly Loading Bindings (즉시 초기 화)
scope 를 연결 할 수 있 는 것 을 제외 하고 대상 은 기본적으로 첫 번 째 호출 때 만 들 어 졌 습 니 다. 즉, 지연 로드 라 는 것 입 니 다. Guice 도 대상 이 Guice 용기 에 주입 할 때 만 들 수 있 도록 합 니 다 (이것 은 단일 모드 에 만 유효 합 니 다).
1 public class EagerSingletonDemo {
2
3 public EagerSingletonDemo() {
4 System.out.println(" constuctor:"+System.nanoTime());
5 }
6 void doit() {
7 System.out.println(" doit:"+System.nanoTime());
8 }
9 public static void main(String[] args) throws Exception{
10 Injector inj = Guice.createInjector(new Module() {
11 @Override
12 public void configure(Binder binder) {
13 binder.bind(EagerSingletonDemo.class).asEagerSingleton();
14 }
15 });
16 System.out.println("before call:"+System.nanoTime());
17 Thread.sleep(100L);
18 inj.getInstance(EagerSingletonDemo.class).doit();
19 }
20 }
결과 출력 은 다음 과 같 습 니 다:
constuctor:26996967388652
before call:26996967713635
doit:26997069993702
우리 의 대상 이 getInstance 를 호출 하기 전에 이미 구 조 된 것 을 볼 수 있다.
1.3.7 스테이지 (운행 단계)
Guice 는 Guice 실행 모드 를 지정 하여 Guice 의 로드 속 도 를 제어 할 수 있 는 필터 도 있 습 니 다.com. google. inject. Stage 매 거 진 에서 TOOL, DEVELOPMENT, PRODUCTION 세 가지 모델 을 제공 합 니 다.
TOOL 은 IDE 등 플러그 인 이 있 는 실행 모드 를 설명 합 니 다.DEVELOPMENT 는 개발 단계 에서 자신 이 필요 로 하 는 기능 만 불 러 오 는 것 을 말한다.한편, PRODUCTION 모드 는 모든 기능 을 완전히 불 러 오 는 것 을 말한다 (단일 대상 에 대해 즉시 불 러 오 는 방식 을 사용한다). 그러면 문 제 를 더욱 일찍 발견 할 수 있 고 특정한 기능 이 필요 할 때 문 제 를 발견 하지 않도록 한다 (우리 의 특정한 기능 이 특정한 조건 이 있어 야 터치 할 수 있다 는 것 을 알 아야 한다).
사실은 비교적 많은 단일 대상 만 있 고 단일 대상 의 구조 가 비교적 오래 걸 리 는 상황 에서 만 유용 하 다.대부분의 경우 이 성능 은 무시 할 수 있다.
기본적으로 Guice 는 DEVELOPMENT 모드 를 사용 합 니 다.
1.3.8 옵션 주입 (옵션 주입)
옵션 주입 설명 은 Guice 용기 에 대상 을 주입 하지 못 하면 기본 대상 을 사용 할 수 있 습 니 다.아래 의 예 를 보시오.
1 public class OptionalInjectionDemo {
2 @Inject(optional=true)
3 Service service = new WwwService();
4 public static void main(String[] args) {
5 Guice.createInjector(new Module() {
6 public void configure(Binder binder) {
7 //binder.bind(Service.class).to(HomeService.class);
8 }
9 }).getInstance(OptionalInjectionDemo.class).service.execute();
10 }
11 }
상기 예 에서 두 번 째 줄 은 옵션 주입 을 설명 합 니 다. Guice 용기 에서 Service 서 비 스 를 가 져 올 수 없다 면 기본 WwService 를 사용 하 십시오. 그렇지 않 으 면 가 져 온 서비스 입 니 다.7 줄 주석 을 지우 면 홈 서비스 서비스 가 실제로 호출 된 것 을 볼 수 있 습 니 다.
지금까지 Guice 는 주입 에 의존 하 는 기본 튜 토리 얼 을 배 웠 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SSH를 통해 MySQL 연결 -> SQL 실행을 한 번에하려고 헛된 이야기SSH 경유로 MySQL 접속->SQL 실행을 1발로 하는 것으로-! ! (`Δ´) 1. 우선, 발판 서버에 액세스하기 때문에 2.다음에 mysql에 접속하고 싶으니까 3. 마지막으로 실행하려는 SQL은 4. 이 3...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.