Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单例类的场注入_Java_Singleton_Guice - Fatal编程技术网

Java 单例类的场注入

Java 单例类的场注入,java,singleton,guice,Java,Singleton,Guice,我有接口: public interface DataStorage { boolean setData(String dataName); boolean unsetData(String dataName); Map getData(); } 以及他的实施: public class DataStorageImpl implements DataStorage { private Map dataMap = new HashMap<>();

我有接口:

public interface DataStorage {
    boolean setData(String dataName);

    boolean unsetData(String dataName);

    Map getData();
}
以及他的实施:

public class DataStorageImpl implements DataStorage {

    private Map dataMap = new HashMap<>();

    public synchronized boolean setData(String dataName) {
        dataMap.put(dataName, true);

        return true;
    }

    public synchronized boolean unsetData(String dataName) {
        dataMap.put(dataName, false);

        return true;
    }

    public synchronized Map getData() {
        return dataMap;
    }
}
public class DataStorageModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(DataStorage.class).annotatedWith(Names.named("DataStorage")).to(DataStorageImpl.class).in(Singleton.class);
    }

}
我正在尝试将数据存储注入我的Netty请求处理程序。请求处理程序代码:

public class DataMethodsHandler {
    @Inject @Named("DataStorage")
    private DataStorage dataStorage;

    public String version() {
        return "0.0.1";
    }

    public Map list_data() {
        return dataStorage.getData();
    }

    public boolean set_data(String dataName) {
        return dataStorage.setData(dataName);
    }

    public boolean unset_data(String dataName) {
        return dataStorage.unsetData(dataName);
    }
}
以及负责将请求处理程序绑定到Netty的代码:

    PropertyHandlerMapping phm = new CustomPropertyHandlerMapping();
    phm.setVoidMethodEnabled(true);
    try {
        phm.addHandler("", dataMethodsHandler.class);
    } catch (XmlRpcException e) {
        e.printStackTrace();
    }

调用XMLRPC方法时,set_数据请求失败,因为DataMethodsHandler中的dataStorage字段为null。我做错了什么?我找到了解决办法。首先,我们应该用以下代码替换调用Class.newInstance的默认RequestProcessorFactory方法getRequestProcessorFactory:

public class XmlRpcServerClientRequestProcessorFactoryFactory implements RequestProcessorFactoryFactory {

    @Inject
    private Injector injector;
    @Inject
    public XmlRpcServerClientRequestProcessorFactoryFactory(Injector injector) {
        this.injector = injector;
    }

    @Override
    public RequestProcessorFactory getRequestProcessorFactory(final Class pClass)
            throws XmlRpcException {
        return new RequestProcessorFactory() {
            @SuppressWarnings("unchecked")
            @Override
            public Object getRequestProcessor(XmlRpcRequest pRequest)
                    throws XmlRpcException {
                return injector.getInstance(pClass);
            }
        };
    }
}
为GUI创建模块:

public class NettyXmlRpcModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(NettyXmlRpcModule.class);
        bind(XmlRpcServerClientRequestProcessorFactoryFactory.class).in(Singleton.class);
        bind(Integer.TYPE).annotatedWith(Names.named("xmlrpc.port")).toInstance(3133);
    }


    @Provides
    @Singleton
    Log providesLog(){
        return LogFactory.getLog(NettyXmlRpcWebServer.class);
    }

    @Provides
    InetAddress providesInetAddress() throws UnknownHostException {
        return InetAddress.getLocalHost();
    }
}
然后为处理程序设置新工厂:

PropertyHandlerMapping phm = new CustomPropertyHandlerMapping();
        phm.setRequestProcessorFactoryFactory(xmlRpcServerClientRequestProcessorFactoryFactory);

phm.setVoidMethodEnabled(true);
try {
    phm.addHandler("", methodsHandler);
} catch (XmlRpcException e) {
    e.printStackTrace();
}
xmlRpcServer.setHandlerMapping(phm);

现在,处理程序将捕获所有请求,所有带注释的字段都将被注入。

看起来您的PropertyHandlerMapping没有使用GUI来实例化DataMethodsHandler@TavianBarnes非常感谢。我刚开始学Guice。如果你不复杂,你能提供一个链接或告诉我在谷歌搜索的关键字吗?一些建议:你应该使用字段注入或构造函数注入,而不是两者都使用。当你需要注射注射器时,后退一步,重新考虑你的设计。通常,让一个注入器创建整个实例树就足够了,例如在主方法或servlet过滤器中。最后一点:什么是工厂?使用guice/DI将使大多数工厂过时,因为您在模块中配置实例的创建,使用提供者或带有辅助注入的通用工厂…@JanGalinski感谢您的建议。FactoryFactory是Apache的XMLRpc库中的一个奇怪接口。我不能完全改变这个库的行为,但是使用重写的方法效果很好。