2016-01-05 29 views
0

在我的示例弹簧启动应用程序中,我添加了一个自定义jar的依赖项。我的示例应用程序支持web和jpa。从罐子弹簧启动扫描类问题

我创建的jar包含一个Spring MVC控制器。下面是示例代码

@Controller 
public class StartStopDefaultMessageListenerContainerController { 
    @Autowired(required=false) 
    private Map<String, DefaultMessageListenerContainer> messageListeners; 

在我的代码的任何地方我还没有手动创建该控制器的bean实例。

问题 - 当我通过运行主类来启动我的弹簧启动应用程序时,我在自动装配DefaultMessageListenerContainer时遇到控制台中出现错误。

我的问题是,即使此类StartStopDefaultMessageListenerContainerController只存在于类路径中,它不应该创建bean,并且不应该发生自动装配。但是,spring boot会自动扫描这个类,然后尝试自动装入这些字段。

这是春天的正常行为,无论如何,我可以避免这种情况吗?

+0

为什么不应该它产生的呢?如果它属于被扫描的软件包,它将被创建,所以起初我会说是的,这是应该发生的。 –

+0

所以我不会把它放在任何包scanner.I中,我刚刚在我的pom.xml中添加了jar。据我所知,Spring引导会自动扫描所有属于@SpringBootApplication注释类的软件包。 – user3534483

+0

和所有的子包。另外,如果另外一个'@ Configuration'与另外的'@ ComponentScan'一起出现,那么它也是有效的。 –

回答

0

如果StartStopDefaultMessageListenerContainerController类是弹簧容器的component scanning的一部分,Yes弹簧会尝试实例化并解析所有依赖项。

这里你的问题是@Autowired收集。春天docs说,被自己定义为一个集合或地图类型

豆类无法通过@Autowired注入,因为类型匹配是没有正确适用于他们。对这些bean使用@Resource,通过唯一名称引用特定的集合或映射bean。

并请一并参考inject-empty-map-via-spring

+0

StartStopDefaultMessageListenerContainerController存在于刚刚添加到我的pom.xml中的xyz.jar中。我不是没有明确地扫描这个类,也没有创建它的bean – user3534483

+0

阅读https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html – Lovababu

+0

我明白这个区别在于,它扫描应用程序中的所有类。这里的问题是,为什么它会从罐子里扫描类? – user3534483