Java110CmdDocDiscoveryRegistrar.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package com.java110.doc.registrar;
  2. import com.java110.doc.annotation.Java110CmdDoc;
  3. import com.java110.doc.annotation.Java110CmdDocDiscovery;
  4. import com.java110.doc.entity.CmdDocDto;
  5. import org.springframework.beans.factory.BeanClassLoaderAware;
  6. import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
  7. import org.springframework.beans.factory.config.BeanDefinition;
  8. import org.springframework.beans.factory.support.BeanDefinitionRegistry;
  9. import org.springframework.context.ResourceLoaderAware;
  10. import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
  11. import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
  12. import org.springframework.core.io.ResourceLoader;
  13. import org.springframework.core.type.AnnotationMetadata;
  14. import org.springframework.core.type.filter.AnnotationTypeFilter;
  15. import org.springframework.util.ClassUtils;
  16. import org.springframework.util.StringUtils;
  17. import java.beans.Introspector;
  18. import java.lang.annotation.Annotation;
  19. import java.lang.reflect.InvocationTargetException;
  20. import java.lang.reflect.Method;
  21. import java.util.HashSet;
  22. import java.util.Map;
  23. import java.util.Set;
  24. /**
  25. * api 文档 注入类
  26. * Created by wuxw on 2018/7/2.
  27. */
  28. public class Java110CmdDocDiscoveryRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware {
  29. private ResourceLoader resourceLoader;
  30. private ClassLoader classLoader;
  31. public Java110CmdDocDiscoveryRegistrar() {
  32. }
  33. @Override
  34. public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
  35. try {
  36. registerListener(importingClassMetadata, registry);
  37. } catch (NoSuchMethodException e) {
  38. e.printStackTrace();
  39. } catch (InvocationTargetException e) {
  40. e.printStackTrace();
  41. } catch (IllegalAccessException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. @Override
  46. public void setBeanClassLoader(ClassLoader classLoader) {
  47. this.classLoader = classLoader;
  48. }
  49. @Override
  50. public void setResourceLoader(ResourceLoader resourceLoader) {
  51. this.resourceLoader = resourceLoader;
  52. }
  53. /**
  54. * 注册侦听
  55. *
  56. * @param metadata
  57. * @param registry
  58. */
  59. public void registerListener(AnnotationMetadata metadata,
  60. BeanDefinitionRegistry registry) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  61. ClassPathScanningCandidateComponentProvider scanner = getScanner();
  62. scanner.setResourceLoader(this.resourceLoader);
  63. Set<String> basePackages;
  64. Map<String, Object> attrs = metadata
  65. .getAnnotationAttributes(Java110CmdDocDiscovery.class.getName());
  66. Object cmdPublishClassObj = attrs.get("cmdDocClass");
  67. //Assert.notNull(cmdPublishClassObj,"Java110CmdDiscovery 没有配置 cmdPublishClass 属性");
  68. Class<?> cmdPublishClass = (Class<?>) cmdPublishClassObj;
  69. AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(
  70. Java110CmdDoc.class);
  71. scanner.addIncludeFilter(annotationTypeFilter);
  72. basePackages = getBasePackages(metadata);
  73. for (String basePackage : basePackages) {
  74. Set<BeanDefinition> candidateComponents = scanner
  75. .findCandidateComponents(basePackage);
  76. for (BeanDefinition candidateComponent : candidateComponents) {
  77. if (candidateComponent instanceof AnnotatedBeanDefinition) {
  78. // verify annotated class is an interface
  79. AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
  80. AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
  81. Map<String, Object> attributes = annotationMetadata
  82. .getAnnotationAttributes(
  83. Java110CmdDoc.class.getCanonicalName());
  84. String beanName = getListenerName(attributes, beanDefinition);
  85. CmdDocDto cmdDocDto = new CmdDocDto();
  86. Class<?> clazz = null;
  87. try {
  88. clazz = Class.forName(beanDefinition.getBeanClassName());
  89. } catch (ClassNotFoundException e) {
  90. throw new RuntimeException(e);
  91. }
  92. cmdDocDto.setCmdClass(clazz);
  93. cmdDocDto.setDescription(attributes.get("description").toString());
  94. cmdDocDto.setAuthor(attributes.get("author").toString());
  95. cmdDocDto.setResource(attributes.get("resource").toString());
  96. cmdDocDto.setTitle(attributes.get("title").toString());
  97. cmdDocDto.setUrl(attributes.get("url").toString());
  98. cmdDocDto.setVersion(attributes.get("version").toString());
  99. cmdDocDto.setHttpMethod(attributes.get("httpMethod").toString());
  100. cmdDocDto.setServiceCode(attributes.get("serviceCode").toString());
  101. /*BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, beanName);
  102. BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);*/
  103. Method method = cmdPublishClass.getMethod("addCmdDoc", CmdDocDto.class);
  104. method.invoke(null, cmdDocDto);
  105. }
  106. }
  107. }
  108. }
  109. protected ClassPathScanningCandidateComponentProvider getScanner() {
  110. return new ClassPathScanningCandidateComponentProvider(false) {
  111. @Override
  112. protected boolean isCandidateComponent(
  113. AnnotatedBeanDefinition beanDefinition) {
  114. if (beanDefinition.getMetadata().isIndependent()) {
  115. // TODO until SPR-11711 will be resolved
  116. if (beanDefinition.getMetadata().isInterface()
  117. && beanDefinition.getMetadata()
  118. .getInterfaceNames().length == 1
  119. && Annotation.class.getName().equals(beanDefinition
  120. .getMetadata().getInterfaceNames()[0])) {
  121. try {
  122. Class<?> target = ClassUtils.forName(
  123. beanDefinition.getMetadata().getClassName(),
  124. Java110CmdDocDiscoveryRegistrar.this.classLoader);
  125. return !target.isAnnotation();
  126. } catch (Exception ex) {
  127. this.logger.error(
  128. "Could not load target class: "
  129. + beanDefinition.getMetadata().getClassName(),
  130. ex);
  131. }
  132. }
  133. return true;
  134. }
  135. return false;
  136. }
  137. };
  138. }
  139. protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata) {
  140. Map<String, Object> attributes = importingClassMetadata
  141. .getAnnotationAttributes(Java110CmdDocDiscovery.class.getCanonicalName());
  142. Set<String> basePackages = new HashSet<String>();
  143. for (String pkg : (String[]) attributes.get("value")) {
  144. if (StringUtils.hasText(pkg)) {
  145. basePackages.add(pkg);
  146. }
  147. }
  148. for (String pkg : (String[]) attributes.get("basePackages")) {
  149. if (StringUtils.hasText(pkg)) {
  150. basePackages.add(pkg);
  151. }
  152. }
  153. if (basePackages.isEmpty()) {
  154. basePackages.add(
  155. ClassUtils.getPackageName(importingClassMetadata.getClassName()));
  156. }
  157. return basePackages;
  158. }
  159. /**
  160. * 获取名称
  161. *
  162. * @param listeners
  163. * @param beanDefinition
  164. * @return
  165. */
  166. private String getListenerName(Map<String, Object> listeners, AnnotatedBeanDefinition beanDefinition) {
  167. if (listeners == null) {
  168. String shortClassName = ClassUtils.getShortName(beanDefinition.getBeanClassName());
  169. return Introspector.decapitalize(shortClassName);
  170. }
  171. String value = (String) listeners.get("value");
  172. if (!StringUtils.hasText(value)) {
  173. value = (String) listeners.get("name");
  174. }
  175. if (StringUtils.hasText(value)) {
  176. return value;
  177. }
  178. String shortClassName = ClassUtils.getShortName(beanDefinition.getBeanClassName());
  179. value = Introspector.decapitalize(shortClassName);
  180. return value;
  181. }
  182. }