2015-07-25 2 views
2

Я заметил, что при использовании аннотации к весеннему или весеннему mvc некоторые программисты придают аннотации имя вместе с ним. Например:Есть ли причина, по которой мы даем весеннюю аннотацию имени?

@Repository("customerRepository") 
public class CustomerRepositoryImpl implements CustomerRepository{ 
} 

Я считаю, что класс функционирует та же, не давая @Repository имя. Будет ли ситуация, которая назвала бы аннотацию полезной?

ответ

4

В основном это предназначено для решения двусмысленности при выполнении автоматического сканирования и использования @Autowired. Я дал подробный ответ, объясняющий о @Autowired в this answer, который также объясняет необходимость названия bean-компонентов.

Предположим, у нас есть 2 классов, реализующих CustomerRepository:

@Repository 
public class MyCustomerRepositoryImpl implements CustomerRepository { 
} 

@Repository 
public class OtherCustomerRepositoryImpl implements CustomerRepository { 
} 

Давайте теперь предположим, что мы имеем класс, который использует @Autowired впрыснуть CustomerRepository:

public class SomeClass { 
    @Autowired 
    private CustomerRepository customerRepository; 
} 

При выполнении автоматического сканирования, вам нужно иметь возможность различать их. В противном случае Spring выкинет исключение, сказав, что он не может определить, какой из компонентов следует вводить.

Так что мы можем теперь добавить логическое имя для каждой реализации:

@Repository("myRepository") 
public class MyCustomerRepositoryImpl implements CustomerRepository { 
} 

@Repository("otherRepository") 
public class OtherCustomerRepositoryImpl implements CustomerRepository { 
} 

И теперь вы можете помочь Spring решить неоднозначность следующим образом:

public class SomeClass { 
    @Autowired 
    @Qualifier("myRepository") 
    private CustomerRepository customerRepository; 
} 
0

Он помогает преобразовать объект в фасоль весны, если автоопределяется.

Из официального дока here: -

Значения может указывать на предложение для логического имени компоненты, быть превращен в Спринге боб в случае автоопределения компонента.

0

AnnotationBeanNameGenerator отвечает за сбор имя для ваших бобов. Если вы укажете имя, вы можете использовать другое соглашение для своих имен компонентов, чем то, что в противном случае было бы создано на основе имени класса.

Автогенерируемые названия фасонов не являются доказательством дурака; два класса с одним и тем же именем могут вызывать двойное определение бина, как и два класса, наследующих один и тот же интерфейс.

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

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