【问题标题】:Basic Google Guice injection. Playframework 2.1基本的 Google Guice 注入。游戏框架 2.1
【发布时间】:2013-07-23 02:48:15
【问题描述】:

我是 Google Guice 的新手,在获取 UserService 实例时遇到了麻烦。 在我的 Playframework 应用程序中,我有一个名为 UserService 的服务,如下所示:

public class UserService { // Note it doesn't implement an interface
    private UserDao userDao;
    private Email email;

    @Inject
    public UserService(UserDao userDao, Email email) {
        this.userDao = userDao;
        this.email = email;
    }

    ...
}

我有这个控制器:

public class UserController extends Controller {
    @Inject
    private UserService userService;

    ...
}

我的 UserModule 有这个 configure() 定义:

protected void configure() {
    bind(UserDao.class).to(UserDaoJpa.class);
    bind(Email.class).to(EmailHtml.class);
    bind(UserController.class);
}

我在 Playframework Global 对象上获取了注入器,它看起来类似于 Guillaume Bort 提供的关于获取控制器实例的示例,在这种情况下,它非常适合获取注入器(getControllerInstance 方法是 Play 2.1 中的新功能,但是这在这里不相关)。有兴趣请见here

public class Global extends GlobalSettings {
    private static final Injector injector = createInjector();

    @Override
    public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
        return injector.getInstance(controllerClass);
    }

    private static Injector createInjector() {
        return Guice.createInjector(new UsuarioModule());
    }
}

此时,一切正常,服务已正确实例化,其参数已解析。控制器按预期获取对象图。 但是,当我尝试在应用程序的其他地方执行@Inject UserService userService 时,userService 为空。例如:

public class EmailAvailableValidator {
    @Inject
    private static UserService userService; // This is not resolved :(

    public static Map<String, List<ValidationError>> validateEmailAndGetErrorsIfAny(String email, String emailField) {
        Map<String, List<ValidationError>> errors = new HashMap<String, List<ValidationError>>();
        if (!userService.isEmailAvailable(email)) {
            List<ValidationError> list = new ArrayList<ValidationError>();
            list.add(new ValidationError("", UsuarioResource.getMessageEmailTaken()));
            errors.put(emailField, list);
        }

        return errors;
    }
}

问题是,获取未实现接口的对象实例的正确方法是什么?是否总是需要实现接口? 不是说guice知道如何解决UserDao和Email吗?为什么除了在 UserController 中它不能实例化它? 我需要这个实例解决了它的依赖关系,我的意思是使用 UserDao 和 Email。

官方的 guice 文档对我帮助不大。

感谢您的帮助!

【问题讨论】:

    标签: java dependency-injection guice playframework-2.1


    【解决方案1】:

    两件事:

    1. 您需要使用 Guice Injector 来实例化 EmailAvailableValidator。您的“全球”课程已经在这样做了。使用注入器创建一个实例,然后设置它的所有注入字段。

    2. 您可能必须使用静态注入来填充静态字段。例如,在您的 configure() 方法中添加:

      requestStaticInjection(UserService.class);
      

      不过我个人没用过所以YMMV。

    参考:

    http://code.google.com/p/google-guice/wiki/Injections

    【讨论】:

    • 将 requestStaticInjection 添加到 Module 在这种情况下对我没有帮助。关于 Guice Injector,我在某处读到使用它进行实例化不是一个好习惯,而是应该使用 @Inject。我对Guice很陌生,也许我错了。感谢您的帮助。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2012-04-01
    • 2011-11-09
    • 2019-04-14
    • 1970-01-01
    • 2015-04-17
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多