Java 使用Guice创建并初始化单例
我在下列课程中有一门课 StorageProxy.java(接口) StorageProxyImpl1.java(StorageProxy接口的实现1) 我在Application类中有一个main方法,用于初始化和使用Resource1和Resource2Java 使用Guice创建并初始化单例,java,guice,Java,Guice,我在下列课程中有一门课 StorageProxy.java(接口) StorageProxyImpl1.java(StorageProxy接口的实现1) 我在Application类中有一个main方法,用于初始化和使用Resource1和Resource2 public class MyApp{ public static void main(String args[]){ Resource1 r1 = new Resource1(); Resource2 r2 = new
public class MyApp{
public static void main(String args[]){
Resource1 r1 = new Resource1();
Resource2 r2 = new Resource2();
runApp(r1,r2);
}
public void runApp(Resource1 r1, Resource2 r2){ // Makes use of r1 and r2
...
}
}
我想为StorageProxy提供依赖注入的guice,这样在创建新的实现时就不会有太多的麻烦。我希望Resource1和Resource2使用StorageProxy的同一个对象(即它应该是Singleton)。init与构造函数分开是至关重要的。总之,我需要创建StorageProxyImpl1的一个实例,并在main方法中对其调用StorageProxyImpl1.init(String),这个实例应该由Resource1和Resource2共享。如何做到这一点
中提出的问题有点高,如果没有具体的例子,我很难理解。您可以使用
公共类StorageProxyProvider实现提供程序{
public-StorageProxy-get(){
StorageProxy StorageProxy=新的StorageProxy();
storageProxy.init();
返回存储代理;
}
}
公共类StorageProxyModule扩展了AbstractModule{
受保护的void configure(){
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
一个有效的例子:
public class StorageProxyProvider implements Provider<StorageProxy> {
public StorageProxy get() {
StorageProxy storageProxy = new StorageProxy();
storageProxy.init();
return storageProxy;
}
}
public class StorageProxy {
public void init(){
System.out.println("init");
}
public void proxy(){
System.out.println("proxy");
}
}
public class StorageProxyModule extends AbstractModule {
protected void configure() {
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
public class Example {
@Inject
StorageProxy storageProxy;
public void doSomethingThatNeedStorageProxy() {
System.out.println(storageProxy);
storageProxy.proxy();
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new StorageProxyModule());
Example e = injector.getInstance(Example.class);
e.doSomethingThatNeedStorageProxy();
e = injector.getInstance(Example.class);
e.doSomethingThatNeedStorageProxy();
}
}
公共类StorageProxyProvider实现提供程序{
public-StorageProxy-get(){
StorageProxy StorageProxy=新的StorageProxy();
storageProxy.init();
返回存储代理;
}
}
公共类存储代理{
公共void init(){
System.out.println(“init”);
}
公共无效代理(){
System.out.println(“代理”);
}
}
公共类StorageProxyModule扩展了AbstractModule{
受保护的void configure(){
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
公开课范例{
@注入
StorageProxy-StorageProxy;
public void doSomethingThatNeedStorageProxy(){
System.out.println(storageProxy);
proxy();
}
}
公共班机{
公共静态void main(字符串[]args){
Injector=Guice.createInjector(新的StorageProxyModule());
示例e=injector.getInstance(Example.class);
e、 doSomethingThatNeedStorageProxy();
e=injector.getInstance(Example.class);
e、 doSomethingThatNeedStorageProxy();
}
}
很抱歉一直有问题。。。我是新来的Guice。。。如果我使用这个方法,我会得到一个空指针异常。我假设资源类中有storageProxyProvider。。有什么问题吗?还有,您是如何创建注入器的?我在回答中添加了一些代码,看一看,我测试了这个示例,它可以正常工作。告诉我你有没有其他的dubts很好。。。最后一个问题。。。如何在示例类中初始化storageProxyProvider?我修复了singleton的一个问题,请更新。在示例类中,我们只需要StorageProxy,Guice将完成所有工作。
public class StorageProxyProvider implements Provider<StorageProxy> {
public StorageProxy get() {
StorageProxy storageProxy = new StorageProxy();
storageProxy.init();
return storageProxy;
}
}
public class StorageProxyModule extends AbstractModule {
protected void configure() {
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
public class StorageProxyProvider implements Provider<StorageProxy> {
public StorageProxy get() {
StorageProxy storageProxy = new StorageProxy();
storageProxy.init();
return storageProxy;
}
}
public class StorageProxy {
public void init(){
System.out.println("init");
}
public void proxy(){
System.out.println("proxy");
}
}
public class StorageProxyModule extends AbstractModule {
protected void configure() {
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
public class Example {
@Inject
StorageProxy storageProxy;
public void doSomethingThatNeedStorageProxy() {
System.out.println(storageProxy);
storageProxy.proxy();
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new StorageProxyModule());
Example e = injector.getInstance(Example.class);
e.doSomethingThatNeedStorageProxy();
e = injector.getInstance(Example.class);
e.doSomethingThatNeedStorageProxy();
}
}