在高谈之前,我认为问题基本上归结为:
如何从应用程序的基于XML的配置中正确实例化@Configuration
bean?
为了模块化我的项目并遵循clean architecture的某些内容,我创建了一个由三个模块组成的Maven 项目。有一个“web”模块,一个“接口”模块和一个“核心”模块,Web和核心都使用Spring的基于Java的配置。
Web模块在其POM中声明对核心模块的运行时依赖性以及对接口模块的编译时依赖性。核心模块是接口模块的实现,后者仅由Java接口和DTO组成。 (这是对program to interface modules的尝试。)
当我启动Web模块时,我希望来自核心模块的所有Spring管理的bean都为Web模块的应用程序上下文所知。通过在核心模块中创建一个XML文件,我已经取得了一些成功的“XML-way”,如下所示:
// This xml snippet is part of the "core" module
<beans>
<context:annotation-config />
<context:component-scan base-package="com.acme.core"/>
</beans>
...并在 web 模块配置中引用它,如下所示:
// The configuration of the "web" module
@Configuration
@ImportResource("classpath*:come/acme/configuration/spring/*.xml")
public class RootConfig {}
它有效,但我对解决方案不满意,因为我希望核心模块的所有配置都以Java方式完成。
所以为此,我注意到Spring says可以执行以下操作:
...
@Configuration
类可以在Spring XML文件中声明为普通定义:
<beans>
<context:annotation-config/>
<bean class="com.acme.configuration.spring.CoreConfig"/>
</beans>
如果它有效,那将是(几乎)理想的,因为核心模块中的XML文件非常精简,并且基本上只是引导CoreConfig
中的丰富配置。但是它对我不起作用,并且Web模块找不到核心模块中定义的任何bean。我认为这可能是因为如果 bean被实例化,那么它们是在不同的应用程序上下文中完成的,或者因为CoreConfig
被标记为@Configuration
,它是特殊的并且实例化这种方式从XML文件中不会触发创建它定义的其他bean。
顺便说一句,我宁愿有一种方法可以在没有任何XML配置的情况下执行此操作,但是直接从Web模块引用com.acme.configuration.spring.AppConfig
是不可能的,因为代码没有编译时依赖性。 (叹气)模块化到目前为止证明比它的价值更麻烦......
答案 0 :(得分:1)
以下在我的示例中的“Web”模块的config类中指定时起作用:
@Configuration
@ComponentScan(basePackages={"com.acme.configuration"})
public class RootConfig {}
事实上,这就是@M。迪林在评论这个问题时表示要做。在此示例中,将检索并正确处理所有com.acme.configuration
个包,无论它们是否位于另一个Maven模块中。按照惯例,有必要将其他模块的所有配置类放在com.acme.configuration
中。使用这种方法,不需要任何XML配置文件来“引导”配置,就像我试图做的那样。