Контекст приложения в многомодульном проекте maven - Spring - PullRequest
0 голосов
/ 04 февраля 2020

Мне трудно понять, как работает контекст приложения в многомодульном проекте.

Допустим, у меня есть WAR-приложение "Приложение". Приложение имеет банки A, B и C. A имеет зависимость pom от B, а C имеет зависимость pom от B. Таким образом, бины, определенные в A, могут использоваться в C, поскольку они упакованы в файл WAR и загружаются во время выполнения.

Файлы контекста приложения A, B и C импортируются в WAR-приложение.

1 Ответ

0 голосов
/ 04 февраля 2020

Да, это возможно. Вот почему:

Просто потому, что Spring может сканировать путь к классу вашего приложения (если вы используете аннотацию java, @ComponentScan('com') загрузит каждый класс, который у вас есть в пакет com.**).

Если вы запускаете JAR C только с его зависимостями и загружаете каждый класс, например, в конкретный пакет, то все будет в порядке, вы не будете есть какие-то сюрпризы.

То же самое, если вы делаете A и B.

Но если вы используете A, B и C, и у вас есть Spring, сканирующий ваши пакеты (некоторые общие пакеты между A и C, например), тогда вы можете иметь bean-компоненты, объявленные A, и bean-объекты, объявленные B. Что может привести к некоторой ошибке, если вы думаете, что у вас есть только один bean-компонент типа Datasource, у вас есть один в A и один в C.

Вот пример:

A имеет источник данных.

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 DataSo urce + 1 JdbcTemplate. ХОРОШО ! - A + B -> 1 источник данных + 1 JdbcTemplate. ХОРОШО ! - A + C + B -> -> 2 источника данных + 1 шаблон Jdbc. KO!

Эта ситуация произойдет, если развернутая WAR также имеет @ComponentScan("com.my").

Так что да, возможно иметь доступ к bean-компоненту, определенному в A в C, но это может быть похоже на скрытые зависимости, ваш код неясен, выполнение неясно и может потерпеть неудачу, как если бы вы не знали, что происходит.

Это понятнее?

...