3

我试图找出ServiceLoader该类的 Spring 类似物是否是标准 SDK API 的一部分。如果有这样一个类,它是如何使用的?

请指教!

4

1 回答 1

4

假设SpringFactoriesLoader是给你的。从它的JavaDocs:

/*
 * General purpose factory loading mechanism for internal use within the framework.
 *
 * <p>The {@code SpringFactoriesLoader} loads and instantiates factories of a given type
 * from "META-INF/spring.factories" files. The file should be in {@link Properties} format,
 * where the key is the fully qualified interface or abstract class name, and the value
 * is a comma-separated list of implementation class names. For instance:
 *
 * <pre class="code">example.MyService=example.MyServiceImpl1,example.MyServiceImpl2</pre>
 *
 * where {@code MyService} is the name of the interface, and {@code MyServiceImpl1} and
 * {@code MyServiceImpl2} are the two implementations.
 */

我们项目之一的样本:

META-INF/spring.factories

org.springframework.integration.config.IntegrationConfigurationInitializer=\
org.springframework.integration.config.GlobalChannelInterceptorInitializer,\
org.springframework.integration.config.IntegrationConverterInitializer

实施:

public class IntegrationConfigurationBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        Set<String> initializerNames = new HashSet<String>(
                SpringFactoriesLoader.loadFactoryNames(IntegrationConfigurationInitializer.class, beanFactory.getBeanClassLoader()));

        for (String initializerName : initializerNames) {
            try {
                Class<?> instanceClass = ClassUtils.forName(initializerName, beanFactory.getBeanClassLoader());
                Assert.isAssignable(IntegrationConfigurationInitializer.class, instanceClass);
                IntegrationConfigurationInitializer instance = (IntegrationConfigurationInitializer) instanceClass.newInstance();
                instance.initialize(beanFactory);
            }
            catch (Exception e) {
                throw new IllegalArgumentException("Cannot instantiate 'IntegrationConfigurationInitializer': " + initializerName, e);
            }
        }
    }

}
于 2014-06-16T16:21:52.303 回答