【问题标题】:Is there an analogue of ServiceLoader in Spring and how to use it?Spring中是否有ServiceLoader的类似物以及如何使用它?
【发布时间】:2014-06-16 16:13:57
【问题描述】:

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

请指教!

【问题讨论】:

    标签: java spring serviceloader


    【解决方案1】:

    假设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);
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多