我试图找出ServiceLoader
该类的 Spring 类似物是否是标准 SDK API 的一部分。如果有这样一个类,它是如何使用的?
请指教!
我试图找出ServiceLoader
该类的 Spring 类似物是否是标准 SDK API 的一部分。如果有这样一个类,它是如何使用的?
请指教!
假设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);
}
}
}
}