Spring @ContextConfiguration Принудительный порядок?

Я написал несколько классов конфигурации в 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 там не работает, так как он не предназначен для упорядочивания классов конфигурации... Есть ли какой-то класс, который можно переопределить, чтобы повлиять на поведение там?


person Florian Schaetz    schedule 20.07.2018    source источник
comment
Вы можете попробовать аннотацию @Order в своих классах конфигурации. Классы с более низким значением для @Order должны быть загружены первыми.   -  person Ivan    schedule 20.07.2018
comment
@Иван К сожалению, нет. Как я уже упоминал, @Order не работает для классов конфигурации (по крайней мере, не в 4.1.7, см. также Javadoc: упорядочение на основе аннотаций поддерживается только для определенных типов компонентов,[..])   -  person Florian Schaetz    schedule 20.07.2018
comment
Вы также можете попробовать @DependsOn пометить (любой) bean-компонент в своем DefaultConfig @DependsOn("dataSource") stackoverflow.com/questions/22178735/. Может быть, это поможет   -  person Ivan    schedule 20.07.2018
comment
@Ivan Это также не сработает, поскольку конфигурация, от которой зависит DefaultConfig, является динамической (по одной на тест/модуль/что угодно). И делать DefaultConfig зависимым от DateSource - плохая идея, так как DefaultConfig предоставляет DataSource при первой загрузке, тем самым выполняя требование DependsOn.   -  person Florian Schaetz    schedule 20.07.2018