1. 说明
    1. 简化使用者的操作,不需要在在启动类上手动加入扫描 @SpringBootApplication(scanBasePackages="com.xx.xx.**")
  2. 参考
  3. 验证
    1. 接口注入版(手动注入对于复杂的项目更友好)
      1. 新建一个自动注入的注解
      2. 使用方使用
        1. 启动类加入 EnableConfig 注解 ```java

注入注解

package com.databstech.doc.standalone.annotation;

import com.databstech.doc.standalone.bean.SwaggerBean; import com.databstech.doc.standalone.config.ServerConfig; import com.databstech.doc.standalone.config.SwaggerConfig; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

/**

  • @author tn
  • @ClassName EnableConfig
  • @description 自动注入spring容器注解方式
  • @date 2020-09-27 09:54 / @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented //1.把需要注入spring容器的类加入进来 @Import({ServerConfig.class, SwaggerBean.class, SwaggerConfig.class}) //2.设置扫描路径:最好是直接把本项目所有类的共有目录放进去 @ComponentScan(“com.databstech.doc.standalone.*“) public @interface EnableConfig { }

使用方 ↓

package com.cr.code.eco.ecoapi;

import com.databstech.doc.standalone.annotation.EnableConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

//使用了 EnableConfig就不需要在用 scanBasePackages 了 //@SpringBootApplication(scanBasePackages = {“com.cr.code.eco.ecoapi.“,”com.databstech.“}) @SpringBootApplication @EnableConfig public class EcoapiApplication {

  1. public static void main(String[] args) {
  2. SpringApplication.run(EcoapiApplication.class, args);
  3. }

}

  1. 1. 自动注入版
  2. 1. 新建一个资源目录 └─resources
  3. └─META-INF<br /> ii. 新建一个全局的配置文件 EnableAutoScanConfiguration
  4. iii. 新建配置文件 spring.factories
  5. ```java
  6. EnableAutoScanConfiguration文件内容
  7. package com.databstech.doc.standalone.scan;
  8. import com.databstech.doc.standalone.bean.SwaggerBean;
  9. import com.databstech.doc.standalone.config.ServerConfig;
  10. import com.databstech.doc.standalone.config.SwaggerConfig;
  11. import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
  12. import org.springframework.context.annotation.ComponentScan;
  13. import org.springframework.context.annotation.Import;
  14. /**
  15. * @author tn
  16. * @ClassName EnableScan
  17. * @description 自动扫描
  18. * @date 2020-09-27 10:17
  19. */
  20. @ConditionalOnWebApplication
  21. #引入需要加入spring容器类,这些配置累
  22. @Import({ServerConfig.class, SwaggerBean.class, SwaggerConfig.class})
  23. #设置扫描路径:最好是直接把本项目所有类的共有目录放进去
  24. @ComponentScan("com.databstech.doc.standalone.**")
  25. public class EnableAutoScanConfiguration {
  26. }
  27. spring.factories 配置文件 内容
  28. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  29. com.databstech.doc.standalone.scan.EnableAutoScanConfiguration
  30. # \是换行
  31. # 多个以逗号分割
  1. 注入第二版(不聚合<@Import>配置文件,配置文件自己使用@ComponentScan) ```java 同样构建 配置文件 但是这里直接指向了需要注入的配置类 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.databstech.apis.resultexception.handler.ControllerExceptionHandler

改配置类中加入 @ComponetScan 即可 @Slf4j @RestControllerAdvice @ComponentScan(basePackages = “com.databstech.apis.resultexception.handler.**”) public class ControllerExceptionHandler {}

  1. 2. 出现的错误
  2. 1. 在聚合gateway时,配置的gateway全局异常无法使用
  3. ```java
  4. 1. 同样使用了通用的公共类进行聚合后注入 如下↓
  5. package com.databstech.doc.gateway.scan;
  6. import com.databstech.doc.gateway.config.ServerConfig;
  7. import com.databstech.doc.gateway.exception.core.ExceptionHandlerConfiguration;
  8. import com.databstech.doc.gateway.factory.DocNameRoutePredicateFactory;
  9. import com.databstech.doc.gateway.sawagger.config.SwaggerResourceConfig;
  10. import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
  11. import org.springframework.context.annotation.ComponentScan;
  12. import org.springframework.context.annotation.FilterType;
  13. import org.springframework.context.annotation.Import;
  14. /**
  15. * @author tn
  16. * @ClassName EnableScan
  17. * @description 自动扫描
  18. * @date 2020-09-27 10:17
  19. */
  20. @ConditionalOnWebApplication
  21. @Import({SwaggerResourceConfig.class,
  22. DocNameRoutePredicateFactory.class,
  23. ExceptionHandlerConfiguration.class,
  24. ServerConfig.class})
  25. @ComponentScan( basePackages = "com.databstech.doc.gateway.**" )
  26. public class EnableAutoScanConfiguration {
  27. }
  28. 2. 但是 ExceptionHandlerConfiguration 出来了无法使用的情况,还是抛出了默认的错误返回,没有返回我是指定的格式
  29. # 默认格式
  30. {
  31. "timestamp": "2020-09-27T12:37:41.912+00:00",
  32. "path": "/api/basic/ribbon/test01",
  33. "status": 500,
  34. "error": "Internal Server Error",
  35. "message": "Connection refused: no further information: /192.168.0.57:1012",
  36. "requestId": "031d5022-1"
  37. }
  38. 我要的格式
  39. {
  40. "code": 503,
  41. "message": "Failed to handle request [GET http://192.168.2.57:200/api/basic/ribbon/test01?param=qweq]: 503 SERVICE_UNAVAILABLE \"Unable to find instance for server-basic\"",
  42. "data": null,
  43. "success": false,
  44. "ts": 1601210351325
  45. }
  46. 3. 最后分开注入成功,具体如下
  47. /**
  48. * @author tn
  49. * @ClassName EnableScan
  50. * @description 自动扫描
  51. * @date 2020-09-27 10:17
  52. */
  53. @ConditionalOnWebApplication
  54. @Import({SwaggerResourceConfig.class,
  55. DocNameRoutePredicateFactory.class,
  56. ServerConfig.class})
  57. @ComponentScan( basePackages = "com.databstech.doc.gateway.**",
  58. excludeFilters= {@ComponentScan.Filter(
  59. type = FilterType.ASSIGNABLE_TYPE,
  60. classes = ExceptionHandlerConfiguration.class)}
  61. )
  62. public class EnableAutoScanConfiguration {
  63. }
  64. # spring.factories
  65. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  66. com.databstech.doc.gateway.scan.EnableAutoScanConfiguration,\
  67. com.databstech.doc.gateway.exception.core.ExceptionHandlerConfiguration
  1. 最开始配置 spring.factories 时文件位置放错了,直接放在了 resources 中,导致配置没有生效