Spring 학습 자료 - 주입 의존 (4)

7525 단어 SSHFrameWork
이 장 에 서 는 역할 영역 (scope, 여기 스 레 드 와 연 결 된 역할 영역 예 가 있 습 니 다), 즉시 초기 화 (Eagerly Loading Bindings), 실행 단계 (Stage), 옵션 주입 (Optional Injection) 등 주입 에 의존 하 는 다른 화 제 를 계속 토론 합 니 다.
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 threadLocal = new ThreadLocal();
24
25         @Override
26         public  Provider scope(final Key key, final Provider unscoped) {
27             return new Provider() {
28                 @Override
29                 public T get() {
30                     T instance = (T) threadLocal.get();
31                     if (instance == null) {
32                         instance = unscoped.get();
33                         threadLocal.set(instance);
34                     }
35                     return instance;
36                 }
37             };
38         }
39
40         @Override
41         public String toString() {
42             return "Scopes.ThreadServiceScope";
43         }
44     }
45   
46     public static void main(String[] args) {
47         final Injector inj=Guice.createInjector(new Module() {
48             @Override
49             public void configure(Binder binder) {
50                 binder.bind(Service.class).to(WwwService.class).in(new ThreadServiceScope());
51             }
52         });
53         for(int i=0;i<3;i++) {
54             new Thread("Thread-"+i) {
55                 public void run() {
56                     for(int m=0;m<3;m++) {
57                         System.out.println(String.format("%s-%d:%d",//
58                                 getName()//
59                                 ,m//
60                                 ,inj.getInstance(Service.class).hashCode()));
61                         try {
62                             Thread.sleep(50L);
63                         } catch (Exception e) {
64                         }
65                     }
66                 }
67             }.start();
68         }
69     }
70 }
71

여기 에는 '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 는 주입 에 의존 하 는 기본 튜 토리 얼 을 배 웠 다.

좋은 웹페이지 즐겨찾기