/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.serviceloader;

import java.util.ServiceLoader;

import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;

Abstract base class for FactoryBeans operating on the JDK 1.6 ServiceLoader facility.
Author:Juergen Hoeller
See Also:
Since:2.5
/** * Abstract base class for FactoryBeans operating on the * JDK 1.6 {@link java.util.ServiceLoader} facility. * * @author Juergen Hoeller * @since 2.5 * @see java.util.ServiceLoader */
public abstract class AbstractServiceLoaderBasedFactoryBean extends AbstractFactoryBean<Object> implements BeanClassLoaderAware { @Nullable private Class<?> serviceType; @Nullable private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
Specify the desired service type (typically the service's public API).
/** * Specify the desired service type (typically the service's public API). */
public void setServiceType(@Nullable Class<?> serviceType) { this.serviceType = serviceType; }
Return the desired service type.
/** * Return the desired service type. */
@Nullable public Class<?> getServiceType() { return this.serviceType; } @Override public void setBeanClassLoader(@Nullable ClassLoader beanClassLoader) { this.beanClassLoader = beanClassLoader; }
Returns:the object to expose
/** * Delegates to {@link #getObjectToExpose(java.util.ServiceLoader)}. * @return the object to expose */
@Override protected Object createInstance() { Assert.notNull(getServiceType(), "Property 'serviceType' is required"); return getObjectToExpose(ServiceLoader.load(getServiceType(), this.beanClassLoader)); }
Determine the actual object to expose for the given ServiceLoader.

Left to concrete subclasses.

Params:
  • serviceLoader – the ServiceLoader for the configured service class
Returns:the object to expose
/** * Determine the actual object to expose for the given ServiceLoader. * <p>Left to concrete subclasses. * @param serviceLoader the ServiceLoader for the configured service class * @return the object to expose */
protected abstract Object getObjectToExpose(ServiceLoader<?> serviceLoader); }