protected <T> T getOrCreateComponent(Class<T> componentClass) {
      return getComponent(componentClass, componentClass.getName());
   }
protected < T > T getOrCreateComponent ( Class < T > componentClass ) { return getComponent ( componentClass , componentClass . getName ( ) ) ; }
Retrieves a component if one exists, and if not, attempts to find a factory capable of constructing the component
(factories annotated with the {@link DefaultFactoryFor} annotation that is capable of creating the component
class).
<p/>
If an instance needs to be constructed, dependencies are then automatically wired into the instance, based on
methods on the component type annotated with {@link Inject}.
<p/>
Summing it up, component retrieval happens in the following order:<br /> 1.  Look for a component that has already
been created and registered. 2.  Look for an appropriate component that exists in the {@link Configuration} that
may be injected from an external system. 3.  Look for a class definition passed in to the {@link Configuration} -
such as an EvictionPolicy implementation 4.  Attempt to create it by looking for an appropriate factory (annotated
with {@link DefaultFactoryFor})
<p/>

@param componentClass type of component to be retrieved.  Should not be null.
@return a fully wired component instance, or null if one cannot be found or constructed.
@throws CacheConfigurationException if there is a problem with constructing or wiring the instance.