为静态和实例可访问性注入数据库实例

时间:2011-02-10 20:58:35

标签: java gwt dependency-injection guice requestfactory

我有一个与GWT的RequestFactory和相关代理一起使用的POJO。 POJO有静态方法(list())和实例方法(persist()),它们需要访问我的数据库。我的数据库连接池设置为通过Guice注入单例。我不确定的是我究竟能如何进行注射,以便这两种方法都可以访问它?

此外,POJO的实例是使用空构造函数创建的,因此无法使用构造函数注入。

以下是一个示例POJO供参考:

public class Person {
    private Integer id;
    private String name;

    public Integer getId() { return this.id; }
    public void setId(Integer id) { this.id = id; }
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }

    public void persist() {
        //TODO: save state to DB
    }
    public static List<Person> list() {
        //TODO: get all people from DB
        return null;
    }
}

2 个答案:

答案 0 :(得分:2)

不知何故,GWT的风格仍然不太了解依赖注入的需求。这在某种程度上是客户端可以原谅的,但在服务器端却没有那么多(说实话,我真的希望,GWT和Guice团队将联合起来改善这种情况。)

现在,幸运的是,Guice为注入静态字段提供了“遗留”机制,请参阅http://code.google.com/docreader/#p=google-guice&s=google-guice&t=Injections中的“静态注入”。因此,您可以将EntityManager / EntityManagerFactory(或您用于执行持久性的任何内容)注入静态字段。

您不必直接执行此操作,但可以使用提供程序。然后选择正确的范围(例如@RequestScoped)以使提供者为您提供正确的实例。

注意:我还没有尝试过(虽然我打算这样做),因为我还没有在一个真实的项目中使用RequestFactory。我希望遗留机制适用于这种情况,但你可能遇到一些障碍(?)

答案 1 :(得分:2)

如果您使用Locator来控制RequestFactory服务器代码如何通过实现适用于您的域对象的Locator.find()来获取POJO的实例,则pojo不必是默认可实例化的。定位器还允许您使用不符合getId() / getVersion()协议的域对象。

@ProxyFor(value = Person.class, locator = PersonLocator.class)
interface PersonProxy extends EntityProxy { .... }

如果您需要更改大多数域名pojos的行为,您可以注入createDomainObject()重载loadDomainObject()和{{1}}。