Да, это возможно. Вот почему:
Просто потому, что 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, но это может быть похоже на скрытые зависимости, ваш код неясен, выполнение неясно и может потерпеть неудачу, как если бы вы не знали, что происходит.
Это понятнее?