Я написал несколько классов конфигурации в Spring (4.1.7), чтобы упростить написание некоторых стандартных вещей (например, тестовых случаев). Для этого я использовал @Condition
, чтобы проверить, например, есть ли уже определенный DataSource
, если нет, создать новый в памяти. Это, конечно, в основном то, что уже предлагает Spring Boot, но, поскольку у нас еще нет Spring Boot в этом приложении, для нас это не вариант.
Все это работает очень хорошо, если вы пишете, например...
@RunWith(SpringJunit4Runner.class)
@ContextConfiguration( classes = {SomeTest.Config.class, DefaultConfig.class} )
public class SomeTest {
static class Config {
...
В этом случае сначала читается статический класс Config
, создаются bean-компоненты, а затем просматривается DefaultConfig
и создается экземпляр, например, DataSource
, если Config
этого не сделал.
Проблема с этим решением заключается в том, что оно содержит неявное знание: вам нужно знать, что вы должны сначала написать более конкретный класс конфигурации в своей аннотации @ContextConfiguration
. Если вы поместите DefaultConfig
первым, он сначала проверит его, а поскольку, например, DataSource
еще не было создано, он создаст его, что может привести к нежелательным побочным эффектам (поскольку некоторые вещи, зависящие от DataSource
, также создаются там, для пример).
Я действительно хотел бы сделать это более стабильным, обеспечив, чтобы DefaultConfig
ВСЕГДА загружалась как последняя конфигурация (без необходимости явно помещать ее последней в аннотацию @ContextConfiguration
). Итак, если разработчик перепутал весь порядок, ничего страшного не происходит, и все по-прежнему работает, как и планировалось, поскольку DefaultConfig
загружается последним и только потом проверяет, например, все ли уже определили DataSource
.
Есть ли способ добиться этого? Мне нужно просто поведение Spring Boot, при котором классы Auto-Configure автоматически обрабатываются последними. Очевидно, что @Order
там не работает, так как он не предназначен для упорядочивания классов конфигурации... Есть ли какой-то класс, который можно переопределить, чтобы повлиять на поведение там?
@Order
в своих классах конфигурации. Классы с более низким значением для@Order
должны быть загружены первыми. - person Ivan   schedule 20.07.2018@Order
не работает для классов конфигурации (по крайней мере, не в 4.1.7, см. также Javadoc: упорядочение на основе аннотаций поддерживается только для определенных типов компонентов,[..]) - person Florian Schaetz   schedule 20.07.2018@DependsOn
пометить (любой) bean-компонент в своемDefaultConfig
@DependsOn("dataSource")
stackoverflow.com/questions/22178735/. Может быть, это поможет - person Ivan   schedule 20.07.2018DefaultConfig
, является динамической (по одной на тест/модуль/что угодно). И делатьDefaultConfig
зависимым отDateSource
- плохая идея, так какDefaultConfig
предоставляетDataSource
при первой загрузке, тем самым выполняя требование DependsOn. - person Florian Schaetz   schedule 20.07.2018