code: @Override
     public <T> T getSPI(Class<T> spiType, ClassLoader loader)
     {
        T returnType = null;
  
        // SPIs provided by framework, defaults can be overridden
        if (DeploymentModelFactory.class.equals(spiType))
        {
           returnType = loadService(spiType, DefaultDeploymentModelFactory.class, loader);
        }
        else if (EndpointMetricsFactory.class.equals(spiType))
        {
           returnType = loadService(spiType, DefaultEndpointMetricsFactory.class, loader);
        }
        else if (LifecycleHandlerFactory.class.equals(spiType))
        {
           returnType = loadService(spiType, DefaultLifecycleHandlerFactory.class, loader);
        }
        else if (SecurityAdaptorFactory.class.equals(spiType))
        {
           returnType = loadService(spiType, DefaultSecurityAdapterFactory.class, loader);
        }
        else if (JMSEndpointResolver.class.equals(spiType))
        {
           returnType = loadService(spiType, DefaultJMSEndpointResolver.class, loader);
        }
        else
        {
           // SPI provided by either container or stack integration that has no default implementation
           returnType = (T)loadService(spiType, null, loader);
        }
  
        if (returnType == null)
           throw Messages.MESSAGES.failedToProvideSPI(spiType);
        
        return returnType;
     }
docs: Gets the specified SPI, using the provided classloader