【问题标题】:Application Context in multi module maven project - Spring多模块Maven项目中的应用程序上下文 - Spring
【发布时间】:2020-05-20 13:30:03
【问题描述】:

我很难理解应用程序上下文在多模块项目中是如何工作的。

假设我有一个 WAR 应用程序“应用程序”。应用程序有 Jar A、B 和 C。A 对 B 有 pom 依赖,C 对 B 有 pom 依赖。所以在 A 中定义的 bean 可以在 C 中使用,因为它们被打包在 WAR 文件中并在运行时加载。

在WAR应用中导入A、B、C的应用上下文文件。

【问题讨论】:

    标签: spring maven-2 applicationcontext


    【解决方案1】:

    是的,这是可能的。原因如下:

    仅仅是因为 Spring 能够扫描您的应用程序的类路径(如果您使用 java 注释,@ComponentScan('com') 将加载您在包 com.** 中的每个类)。

    如果您只运行 JAR C 及其依赖项,并且例如加载特定包中的每个类,那么您会没事的,不会有任何意外。

    A 和 B 一样。

    但是,如果您使用 A、B 和 C,并且让 Spring 扫描您的包(例如 A 和 C 之间的一些常见包),那么您可以拥有由 A 声明的 bean 和由 B 声明的 bean。这可能会出现一些错误如果您认为您只有一个 Datasource 类型的 bean,那么您在 A 中有一个,在 C 中有一个。

    这是一个例子:

    A 有一个 DataSource。

    package com.my.datasource;
    
    @Configuration
    public class MyConfigurationA() {
        @Bean
        public DataSource datasource() {
            //return new datasource...
        }
    }
    

    C 有一个数据源。

    package com.my.datasource;
    
    @Configuration
    public class MyConfigurationC() {
        @Bean
        public DataSource datasource() {
            //return new datasource...
        }
    }
    

    而 B 声明了一个 JdbcTemplate :

    package com.my.template;
    
    @Configuration
    public class MyConfigurationB() {
        @Bean
        public JdbcTemplate template(DataSource ds) {
            return new JdbcTemplate(ds);
        }
    }
    

    如果你运行: - C + B -> 1 个数据源 + 1 个 JdbcTemplate。好的 ! - A + B -> 1 个数据源 + 1 个 JdbcTemplate。好的 ! - A + C + B -> -> 2 个数据源 + 1 个 JdbcTemplate。 KO!

    如果您部署的 WAR 也有 @ComponentScan("com.my"),则会发生这种情况。

    所以是的,可以访问在 C 中定义在 A 中的 bean,但这可能就像隐藏的依赖关系,你的代码不清楚,执行是不确定的,并且可能在你不知道发生了什么的情况下像成功一样失败。

    是不是更清楚了?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 2015-10-10
      • 2013-12-15
      • 2019-03-26
      • 2018-12-29
      • 2014-06-02
      相关资源
      最近更新 更多