【发布时间】: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