The request processor is the object, which is actually performing the request. There is nothing magic about the request processor: It may very well be a POJO. The {@link RequestProcessorFactoryFactory}is passed to the {@link AbstractReflectiveHandlerMapping} at startup.The mapping uses this factory to create instances of {@link RequestProcessorFactory}, which are used to initialize the {@link ReflectiveXmlRpcHandler}. The handler in turn uses its factory to create the actual request processor when a request comes in.
However, the question arises, when and how the request processor is created and whether it needs request specific initialization. The {@link RequestProcessorFactoryFactory} is an object, which makesthat logic pluggable. Unfortunately, we aren't done with a single factory: We even need a factory for factories. The rationale is best explained by looking at the different use cases and how to implement them.
The default {@link RequestProcessorFactoryFactory} is the{@link RequestSpecificProcessorFactoryFactory}. It creates a new processor instance for any request. In other words, it allows to request processor to have some state. This is fine, if the request processor is a lightweight object or needs request specific initialization. In this case, the actual request processor is created and invoked when calling {@link RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.
An alternative implementation is the {@link StatelessProcessorFactoryFactory}, which may be used to create stateless request processors. Stateless request processors are typically heavyweight objects, which have an expensive initialization phase. The processor factory, which is created by {@link #getRequestProcessorFactory(Class pClass)} contains aninitialized singleton, which is returned by {@link RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.
Other alternatives might be a {@link RequestProcessorFactoryFactory}, which maintains a pool of {@link RequestProcessorFactory} instances. The instances areconfigured by calling {@link RequestProcessorFactory#getRequestProcessor(XmlRpcRequest)}.
|
|
|
|