0

Guice를 사용하기 시작했고 guice 방식을 이해하는 데 어려움이 있습니다. 저는 Spring에 매우 친숙 합니다만, 이것은 조금 다른 것 같습니다. 말,Guice 3.0을 사용하여 오브젝트를 주입

public class SomeDAO { 
    @NotNull 
    private DB db = null; 

    public SomeDAO (String databaseName) throws Exception{ 
     xxxxxxxxxxxxxxxxxxxxxxxx 
    } 
} 

나는 컨트롤러가 :

public class SomeController { 
    private SomeDAO someDAO; 
} 

가 어떻게 someDAO 개체를 삽입하려면 여기를 guice를 사용해야합니다

은 내가 DAO 클래스가? SomeDAO 생성자의 databaseName은 SomeController에서 제공되어야합니다.

감사합니다.

답변

4

이상적으로 SomeController은 데이터베이스 이름을 알 필요가 없습니다.

public class SomeDAO { 

    @NotNull 
    private DB db = null; 

    @Inject 
    public SomeDAO (@IndicatesDatabaseName String databaseName) throws Exception { 
    ... 
    } 
} 

:이 같은 일을 할 수있는 데이터베이스 이름을 주입 한 후

public class SomeController { 
    private final SomeDAO someDAO; 

    @Inject 
    SomeController(SomeDAO someDAO) { 
    this.someDAO = someDAO; 
    } 
} 

그리고이 구성 파일이나 응용 프로그램 컨텍스트에서 온 것이며,이 같은 당신의 DAO를 주입 것 이 경우 Guice는 databaseName을 제공합니다 (https://code.google.com/p/google-guice/wiki/BindingAnnotations 참조). 컨트롤러에 데이터베이스 이름에 대한 지식을 제공하려면 컨트롤러에서 DAO를 새로 작성 (컨트롤러를 계속 주입)하거나 보조 주입을 사용하는 것을 고려할 수 있습니다.

편집 : SomeController이 필요 ControllerFactory를 주입 한 후

public class SomeController { 

    private final SomeDAO someDAO; 

    @Inject 
    SomeController(@Assisted String databaseName) { 
    this.someDAO = new SomeDAO(databaseName); 
    } 
} 
public interface ControllerFactory { 
    public SomeController create(String databaseName); 
} 
public static class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    install(new FactoryModuleBuilder() 
    .implement(SomeController.class, SomeController.class) 
    .build(ControllerFactory.class)); 
    } 
} 

그리고 : 컨트롤러가 정말 도움이 분사를 사용할 수있는 데이터베이스에 대해 알 필요가

합니다. 더 많은 주입 된 의존성을 필요로하는 경우에도 동일한 보조 주입을 SomeDAO에 적용 할 수 있습니다.

+0

고마워요 ...하지만 몇 가지 데이터베이스가 연결되어 있으므로 지식은 컨트롤러에만 있습니다 ... 그래서 데이터베이스 이름을 DAO 레이어에 전달해야합니다 ... 당신은 새로운 것을 만들 필요가 있다는 것을 의미합니까? SomeDAO ("데이터베이스")? 이 경우 DI 패턴이 아닙니다. Guice와 DI 방식으로이 작업을 수행하는 방법을 보여 주시겠습니까? – popcoder

+1

DAO가 여러 DB에 어떻게 연결되어 있습니까? 그들은 모두 동일한 스키마를 가지고 있습니까? 보조 주사를 사용하는 예가 추가되었습니다. DI 세계에서'new'를 사용하는 것은 반드시 나쁜 것은 아닙니다. 그것은 당신의 특정한 상황에 달려 있습니다. 컨트롤러 만이 DAO에 대해 알아야 할 것이고 DAO가 다른 의존성을 가지지 않는다면'new'를 고수하십시오. 만약 다른 클라이언트가 컨트롤러를 인스턴스화한다면 당신은 보조 인젝션을 사용하기를 원할 것입니다. – condit

+0

MongoDB를 사용하고 있습니다.이 응용 프로그램에서 스키마에 대해별로 걱정하지 않습니다. – popcoder