2015-07-09 3 views
1

У меня есть некоторые интеграционные тесты, которые должны издеваться над одним из многих компонентов в моей системе. Для этого у меня есть @Configuration, который выглядит следующим образом:Что все правила именования @Configuration для beans?

@Configuration 
public class MockContext { 
    @Primary 
    @Bean 
    public RealBean realBean() { 
     return new MockBean(); 
    } 
} 

Я заметил, что этот метод привыкает, если RealBean является Java класс без@Component. Но если RealBeanявляется в @Component, я должен изменить этот метод контекста выглядеть следующим образом:

@Configuration 
public class MockContext { 
    @Primary 
    @Bean 
    public RealBean getRealBean() { 
     return new MockBean(); 
    } 
} 

Может кто-нибудь объяснить, почему мне нужно изменить это имя методы и где я могу найти все эти правила? Требуется очень много времени для устранения этих проблем: «Почему мой MockContext работает правильно?» вопросы.

FWIW, вот как я использую этот контекст в тесте:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {RealContext.class, MockContext.class}) 
@WebAppConfiguration 
public abstract class AbstractIntegrationTest { 

И моя интеграция тест будет расширить этот класс. Я использую Spring Boot 1.2.4.RELEASE

+0

Я боюсь, что в любом месте, где написаны такие правила. в общем, весеннюю полоску «get» от имени метода и попробуйте с верблюжьим футляром, чтобы получить экземпляр bean. – Bhupi

+0

@Bhupi хорошо в моем втором фрагменте, который не соответствует действительности. –

+0

У вас есть сканирование компонентов, которое вы не показываете? Кроме того, попробуйте извлечь компонент из 'MockBean' из вашего контекста. –

ответ

2

У вас может быть различная фасоль, зарегистрированная одним и тем же типом. Но им нужно иметь разные имена.

Если вы используете @Bean аннотация without name attribute, имя компонента извлекается из имени метода (в вашем случае realBean/getRealBean).

Когда вы используете аннотацию @Component без атрибута (который указывает имя бина), имя компонента извлекается из имени метода, где first letter is lowercased.

Итак, с вашим первым случаем вы получаете столкновение имен. У вас не может быть двух бобов по имени realBean.

Ваш второй пример без столкновения, потому что боб аннотированный @Component имеет имя realBean и второй боб зарегистрирован через @Bean имеет имя getRealBean.

@Primary аннотация помогает Spring выбрать, какой компонент выбрать, если есть два одинаковых типа, и вы: вводят по типу. Когда вы вводите по имени (использование аннотации @Qualifier), вы можете также ввести дополнительный экземпляр.

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