2017-02-15 223 views
1

我正在创建一个使用spring 4.3.0的库。一个spring-boot应用程序将使用此库。目前,我在Spring-Boot应用程序的主类中使用@ComponentScan来扫描库中的Bean,而不是我想自动配置它。所以我做的是我在库中创建了一个配置类,并在配置中声明了@ComponentScan文件。创建自动配置弹簧库以弹簧启动应用程序

消费春季启动应用程序的库后它不扫描库内的豆类和罚球,

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sample.book.client.service.BookService] found for dependency [com.sample.book.client.service.BookService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566) 
... 33 common frames omitted 

如何解决这个问题?为什么Spring在@Configuration之前扫描@service类?

您的帮助应该是可观的,如果需要,我会提供代码示例。

回答

1

我猜你的配置没有从你的启动应用程序默认加载。 我也猜你还没有加入

@EnableAutoConfiguration 

到你的启动应用程序。

因此,您可以尝试将您的配置添加到Annotation @EnableAutoConfiguration以便由应用程序加载。然后,您在库-JAR中放入META-INF/spring.factories的配置会自动加载。

或者你可以在你的@SpringBootApplication@Import配置

+0

我的春天启动的应用程序已经与@SpringBootApplication所以再次宣称SpringBootApplication将redundant.Also已指定“META-INF/spring.factories”注明,我的库是用弹簧不是春,那么启动我如何使用以下导入“org.springframework.boot.autoconfigure.EnableAutoConfiguration”指定自动配置? “EnableAutoConfiguration”由spring-boot提供,不是spring请纠正我,如果我错了 – VelNaga

+1

当你的应用程序是allready a @ SpringBootApplication时,你有AutoConfiguration启用。然后,您可以在库JAR中放置META-INF/spring-factories,或者您可以@导入您的库的配置 –

+0

它可以工作。谢谢。我跟着META-INF/spring.factories“的方法,它的工作方式就像一个魅力,但是你能定义@Import还是可以请你分享一个关于”@Import“的链接? – VelNaga

2

这在我看来,最可能的原因是你的库驻留在不同的包比你的春天启动的应用程序(和它的子包)。使用@SpringBootApplication注释类时,您还会将@ComponentScan注释设置为默认值(即扫描包中给定类所在的组件)。

个人而言,我更喜欢在我的图书馆项目中创建一个@Configuration注释类。这样的类负责正确的库设置(声明组件扫描等)。后来,在依赖项目中,我使用@Import注释来导入该配置类(以及相应的bean)。