环境:
Spring Cloud:Finchley.M8
Spring Boot:2.0.0.RELEASE
目录结构:
可以看到代码第13行的注释,我已经在@ComponentScan注解中添加了Exclude配置项,但是启动服务的时候还是报如下的错误:
2018 - 04 - 12 15 : 59 : 37.815 WARN 17828 --- [ main] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method 'close' failed on bean with name 'eurekaRegistration' : org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration' : Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) 2018 - 04 - 12 15 : 59 : 37.825 INFO 17828 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2018 - 04 - 12 15 : 59 : 37.828 WARN 17828 --- [ost-startStop- 1 ] o.a.c.loader.WebappClassLoaderBase : The web application [ROOT] appears to have started a thread named [spring.cloud.inetutils] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.net.Inet6AddressImpl.getHostByAddr(Native Method) java.net.InetAddress$ 2 .getHostByAddr(InetAddress.java: 932 ) java.net.InetAddress.getHostFromNameService(InetAddress.java: 617 ) java.net.InetAddress.getHostName(InetAddress.java: 559 ) java.net.InetAddress.getHostName(InetAddress.java: 531 ) org.springframework.cloud.commons.util.InetUtils$ 2 .call(InetUtils.java: 162 ) org.springframework.cloud.commons.util.InetUtils$ 2 .call(InetUtils.java: 159 ) java.util.concurrent.FutureTask.run(FutureTask.java: 266 ) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1149 ) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 624 ) java.lang.Thread.run(Thread.java: 748 ) 2018 - 04 - 12 15 : 59 : 37.838 INFO 17828 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2018 - 04 - 12 15 : 59 : 37.961 ERROR 17828 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Field config in com.cloud.web.controller.RibbonConfiguration required a bean of type 'com.netflix.client.config.IClientConfig' that could not be found. Action: Consider defining a bean of type 'com.netflix.client.config.IClientConfig' in your configuration. Process finished with exit code 1 |
日志关键点在倒数第二行,其实原因很简单ComponentScan不去扫单个Ribbon的配置(RibbonConfigureration)不应用于所有Ribbon客户端,那这个当个客户端去加载的时候就要让Component知道不去管理他,否则就回去扫一遍,看我的Ribbon配置类,55行,被我注释了,没有引用到Exclude注解,所以还是去扫了:
问题很简单,把注解加上就好了。。
贴一下几个类的代码:
1、ExcludeFromComponetScan
1 2 | public @interface ExcludeFromComponetScan { } |
2、spring cloud启动加载类:
1 2 3 4 5 6 7 8 9 10 11 12 | @EnableAutoConfiguration //excludeFilters这里的意思是,只要标有ExcludeFromComponetScan注解的类都不会去扫描 @ComponentScan (value = "com.cloud" , excludeFilters = { @ComponentScan .Filter(type = FilterType.ANNOTATION, value=ExcludeFromComponetScan. class )}) @SpringBootApplication (exclude = {DataSourceAutoConfiguration. class }) @EnableEurekaClient @RibbonClient (name = "SPRING-CLOUD-WEB-PROVIDER" , configuration = RibbonConfiguration. class ) public class SpringCloudRibbonApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudRibbonApplication. class , args); } } |
3、RibbonConfiguration
1 2 3 4 5 6 7 8 9 10 11 12 13 | //这个类不能喝Spring Boot @ConponentScan所在主类放在同一个包或其子包下,否则需要些Exclude类做区分 @ExcludeFromComponetScan @Configuration public class RibbonConfiguration { @Autowired IClientConfig config; @Bean public IRule ribbonRule(IClientConfig config) { //随机算法 return new RandomRule(); } } |