(1). 概述
前面对Spring Plugin有了一个简单的使用,在这里对Spring Plugin进行源码剖析.
(2). 入口在哪?
@EnablePluginRegistries({ SamplePlugin.class, AnotherPlugin.class })
(3). EnablePluginRegistries
package org.springframework.plugin.core.config;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Import;
import org.springframework.plugin.core.Plugin;
import org.springframework.plugin.core.PluginRegistry;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
// ***************************************************************
// 重点:通过@Import导入了一个ImportBeanDefinitionRegistrar的实现
// ***************************************************************
@Import(PluginRegistriesBeanDefinitionRegistrar.class)
public @interface EnablePluginRegistries {
Class<? extends Plugin<?>>[] value();
}
(4). PluginRegistriesBeanDefinitionRegistrar
public class PluginRegistriesBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 从容器中,获得标注有注解:@EnablePluginRegistries的类
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnablePluginRegistries.class.getName());
if (annotationAttributes == null) {
LOG.info("No EnablePluginRegistries annotation found on type {}!", importingClassMetadata.getClassName());
return;
}
// 获得注解@EnablePluginRegistries(value={ SamplePlugin.class, AnotherPlugin.class })
Class<?>[] types = (Class<?>[]) annotationAttributes.get("value");
for (Class<?> type : types) {
// ***********************************************************
// 定义Bean信息(PluginRegistryFactoryBean)
// ***********************************************************
RootBeanDefinition beanDefinition = new RootBeanDefinition(getTargetType(type, PluginRegistryFactoryBean.class));
beanDefinition.setTargetType(getTargetType(type, OrderAwarePluginRegistry.class));
beanDefinition.setBeanClass(PluginRegistryFactoryBean.class);
// ***********************************************************
// 配置type为Plugin的实现类(SamplePlugin/AnotherPlugin)
// ***********************************************************
beanDefinition.getPropertyValues().addPropertyValue("type", type);
// 看下Plugin接口上是否拥有注解@Qualifier
Qualifier annotation = type.getAnnotation(Qualifier.class);
// If the plugin interface has a Qualifier annotation, propagate that to the bean definition of the registry
if (annotation != null) {
AutowireCandidateQualifier qualifierMetadata = new AutowireCandidateQualifier(Qualifier.class);
qualifierMetadata.setAttribute(AutowireCandidateQualifier.VALUE_KEY, annotation.value());
beanDefinition.addQualifier(qualifierMetadata);
}
// Default
String beanName = annotation == null //
? StringUtils.uncapitalize(type.getSimpleName() + "Registry") // SamplePluginRegistry
: annotation.value(); // 使用注解(@Qualifier)上的名称
// **************************************************
// 向Spring中注册FactoryBean(PluginRegistryFactoryBean)
// **************************************************
registry.registerBeanDefinition(beanName, beanDefinition);
} // end for
} // end registerBeanDefinitions
}
(5). 总结
注解@EnablePluginRegistries的目的是向Spring容器中注册Bean(PluginRegistryFactoryBean)