Java 为静态和实例可访问性注入DB实例
我有一个POJO,它与GWT的RequestFactory和一个关联的代理一起使用。POJO既有静态方法(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;
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
构造函数。