17eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee/**
27eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * Copyright (C) 2006 Google Inc.
37eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee *
47eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * Licensed under the Apache License, Version 2.0 (the "License");
57eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * you may not use this file except in compliance with the License.
67eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * You may obtain a copy of the License at
77eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee *
87eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * http://www.apache.org/licenses/LICENSE-2.0
97eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee *
107eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * Unless required by applicable law or agreed to in writing, software
117eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * distributed under the License is distributed on an "AS IS" BASIS,
127eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * See the License for the specific language governing permissions and
147eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * limitations under the License.
157eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee */
167eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
177eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepackage com.google.inject.example;
187eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
197eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleeimport static junit.framework.Assert.assertTrue;
207eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
217eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee/**
227eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee * @author crazybob@google.com (Bob Lee)
237eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee */
247eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic class ClientServiceWithDependencyInjection {
257eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
267eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee// 62 lines
277eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
287eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic interface Service {
297eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  void go();
307eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
317eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
327eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic static class ServiceImpl implements ClientServiceWithDependencyInjection.Service {
337eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public void go() {
347eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    // ...
357eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
367eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
377eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
387eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic static class ServiceFactory {
397eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
407eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  private ServiceFactory() {}
417eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
427eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  private static final Service service = new ServiceImpl();
437eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
447eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public static Service getInstance() {
457eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    return service;
467eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
477eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
487eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
497eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic static class Client {
507eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
517eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  private final Service service;
527eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
537eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public Client(Service service) {
547eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    this.service = service;
557eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
567eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
577eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public void go() {
587eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    service.go();
597eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
607eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
617eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
627eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic static class ClientFactory {
637eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
647eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  private ClientFactory() {}
657eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
667eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public static Client getInstance() {
677eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    Service service = ServiceFactory.getInstance();
687eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    return new Client(service);
697eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
707eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
717eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
727eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic void testClient() {
737eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  MockService mock = new MockService();
747eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  Client client = new Client(mock);
757eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  client.go();
767eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  assertTrue(mock.isGone());
777eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
787eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
797eb9f4449d2e2c70e012bcef508c2346861d30d0crazybobleepublic static class MockService implements Service {
807eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
817eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  private boolean gone = false;
827eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
837eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public void go() {
847eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    gone = true;
857eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
867eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
877eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public boolean isGone() {
887eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    return gone;
897eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
907eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
917eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee
927eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  public static void main(String[] args) {
937eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee    new ClientServiceWithDependencyInjection().testClient();
947eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee  }
957eb9f4449d2e2c70e012bcef508c2346861d30d0crazyboblee}
96