Java 为静态和实例可访问性注入DB实例

Java 为静态和实例可访问性注入DB实例,java,gwt,dependency-injection,guice,requestfactory,Java,Gwt,Dependency Injection,Guice,Requestfactory,我有一个POJO,它与GWT的RequestFactory和一个关联的代理一起使用。POJO既有静态方法(list())也有实例方法(persist()),需要访问我的数据库。我的数据库连接池被设置为通过Guice作为单例注入。我不确定的是,我如何准确地执行注入,以便这两种类型的方法都可以访问它 此外,POJO的实例是使用空构造函数创建的,因此无法使用构造函数注入 以下是一个示例POJO,仅供参考: public class Person { private Integer id;

我有一个POJO,它与GWT的RequestFactory和一个关联的代理一起使用。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;
    }
}
公共类人物{
私有整数id;
私有字符串名称;
公共整数getId(){返回this.id;}
public void setId(整数id){this.id=id;}
公共字符串getName(){返回this.name;}
public void setName(字符串名){this.name=name;}
公共图书馆{
//TODO:将状态保存到数据库
}
公共静态列表(){
//TODO:从DB获取所有人员
返回null;
}
}

不知何故,GWT的风格仍然没有很好地意识到依赖注入的需求。在某种程度上,这在客户端是可以原谅的,但在服务器端却不是那么容易(老实说,我真的希望GWT和Guice团队能够联合起来改善这种情况)

现在,幸运的是,Guice为注入静态字段提供了一种“遗留”机制,请参见中的“静态注入”。因此,您可以将EntityManager/EntityManagerFactory(或用于执行持久性的任何内容)注入到静态字段中

您不必直接这样做,但可以使用提供者。然后选择正确的作用域(例如@RequestScoped),使提供程序为您提供正确的实例


注意:我还没有尝试过(尽管我计划这么做),因为我还没有在实际项目中使用RequestFactory。我希望遗留机制在这种情况下可以工作,但是您可能会遇到一些障碍(?)

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

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

如果您需要更改大多数域POJO的行为,您可以注入一个重载
createDomainObject()
loadDomainObject()

的函数,如果您想使用依赖项注入,您不应该对单例有依赖项,以便可以注入吗?Ie将其传递给对象的构造函数。据我所知,在这种情况下不能使用空构造函数。我无法控制调用哪个构造函数。我应该说得更清楚。RequestFactory框架自动调用默认构造函数和setXXX方法来构建POJO。如果没有可见的默认构造函数,它将出错。我不确定为什么我没有想到这一点,但它工作得很好。我的模块创建一个连接池提供程序的渴望单例,然后静态地将其注入工厂,从而允许从任何地方进行静态访问。当然不是最好的解决方案,但它会很好地工作。希望GWT的RequestFactory在将来的版本中能够知道可注入构造函数,这样就可以避免这种情况。另外,我刚刚看到2.1.1允许使用可链接的服务装饰器,它(显然)允许您执行自定义操作(例如Guice实例化)。如果您需要更多自定义实例化,这绝对是一个好方法。我本来打算使用这个方法进行Guice实例化,但我意识到,由于我已经在为带有Guice绑定的
/gwtRequest
URL提供服务,它也会自动使用Guice进行实例化,从而允许
@Inject
构造函数。