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
RequestProcessorFactoryFactory
is passed to the
AbstractReflectiveHandlerMapping
at startup.
The mapping uses this factory to create instances of
RequestProcessorFactoryFactory.RequestProcessorFactory
, which are used to initialize
the
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
RequestProcessorFactoryFactory
is an object, which makes
that 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
RequestProcessorFactoryFactory
is the
RequestProcessorFactoryFactory.RequestSpecificProcessorFactoryFactory
. It creates a new
processor instance for any request. In other words, it allows the
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
RequestProcessorFactoryFactory.RequestProcessorFactory.getRequestProcessor(XmlRpcRequest)
.
An alternative implementation is the
RequestProcessorFactoryFactory.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
getRequestProcessorFactory(Class pClass)
contains an
initialized singleton, which is returned by
RequestProcessorFactoryFactory.RequestProcessorFactory.getRequestProcessor(XmlRpcRequest)
.
Other alternatives might be a
RequestProcessorFactoryFactory
, which maintains a pool
of
RequestProcessorFactoryFactory.RequestProcessorFactory
instances. The instances are
configured by calling
RequestProcessorFactoryFactory.RequestProcessorFactory.getRequestProcessor(XmlRpcRequest)
.