2015-09-18 4 views
1

В коде, в котором я играю, я видел, что несколько мест были классом @Configuration, но не определяют статический класс. Формат варьируется, но в целом что-то вроде этого:Каково использование класса @Configuration для определения другого класса @Configuration?

@Configuration 
public class someAutoConfiguration { 

    @EnableConfigurationProperty(...) 
    @utoConfigureAfter(...) 
    @Configureation 
    public static class someConfiguration 
    { 
     @Autowired 
     //whatever needs autowired 

     @Bean 
     public myBean createBean(){ 

      //construct bean 
     } 
    } 

Это ясно, как эти бобы работает и что делает класс, но я путать две вещи, почему это необходимо, и скорее это даже после договора @configuration.

Все определение, которое я могу найти для @Configuration, говорит о том, что оно используется для определения bean-компонентов с помощью @Bean, я еще не смог найти никаких других обещаний для аннотации. Таким образом, кажется, что не было бы обещаний, что статический класс будет даже построен или признан как файл @Configuration в его собственном праве? Это ясно, и я не удивлен, что это будет, но работает ли контракт @Configuration такое поведение?

второй, в чем преимущество? Предположительно, есть некоторые причины, по которым нам нужны два класса, вместо того, чтобы удалить статический класс и поместить все его аннотации в родительский класс?

ответ

2

При загрузке вложенных классов необходимо лишь зарегистрировать некоторую конфигурацию (в вашем примере) в контексте приложения. В силу того, что вы вложенный класс @Configuration, someConfiguration (в вашем примере) будет зарегистрирован автоматически. Это позволяет избежать необходимости использовать аннотацию @Import, когда связь между someAutoConfiguration & someConfiguration уже неявно понятна.

Вам понадобится использовать @Import(someConfiguration.class) в случае, если вы выбрали иначе.

+0

Вы можете достичь того же с '@ ComponentScan'? –

+1

, оглядываясь назад на древний вопрос, ни один ответ не смог решить, почему этот код существует, что может быть просто потому, что код действительно был бессмысленным, как предполагал мой первый инстинкт. Вы, по крайней мере, ответили на половину моего вопроса, поэтому, взяв это, кто-то заслуживает кредита;) – dsollen

1

Вы путаетесь между двумя совершенно разными вещами. Класс, аннотированный с использованием @Configuration и содержащий определение Beans, является альтернативой основанному на XML подходу Spring Context. В этом классе нет необходимости в вложенном классе.

Если вы пишете тесты интеграции для своего приложения, вы можете использовать вложенный класс, чтобы указать конфигурацию. Например,

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class FooTest { 

    @Configuration 
    static class ContextConfiguration { 

     @Bean 
     public Foo foobar() { 
      return new Foo(); 
     } 
    } 

    @Autowired 
    private Foo foobar; 

    @Test 
    public void testFoo() { 
     /* ... */ 
    } 
} 

В качестве альтернативы, вы можете также использовать класс Configuration (Если вы определили любой) следующим образом:

@ContextConfiguration(classes=YourConfiguration.class, loader=AnnotationConfigContextLoader.class) 
+0

Я не тот, кто это делает, код, который я получил. Я просто пытаюсь понять, почему. – dsollen

+0

Что вы пытаетесь достичь? – user2004685

+0

Это то, на что я надеялся, что кто-то может сказать мне :) в этот момент мое лучшее впечатление заключается в том, что были некоторые места, где использовался статический класс конфигурации, поэтому вызовы могли быть сделаны в нем статически во время конфигурации, и потому, что все скопировали все эти который не нуждался в статическом классе, в конечном итоге это делало. Кроме того, разработчики были довольно хороши в противном случае, я удивлен, что они будут такими неряшливыми, было бы интересно, если я что-то упустил. – dsollen

Смежные вопросы