Подтвердить что ты не робот

Разница между аннотациями Spring

Вопросы:

1) Разница между @Component и @Configuration?

Я прочитал, что оба исключают необходимость подключения кода, который нужно поместить в XML, но не получили разницы между ними.

2) Каковы различия между @Autowired, @Inject и @Resource?
- Какой из них использовать, когда?
- Каковы плюсы и минусы каждого?

4b9b3361

Ответ 1

@Component и @Configuration действительно очень разные типы аннотаций.

@Component и аналогичные аннотации (@Service, @Repository и т.д.) и его JSR-330 @Named allow вы объявляете beans, которые должны быть взяты автосканированием с помощью <context:component-scan/> или @ComponentScan, они регистрируют определение bean для классов, поэтому они примерно эквивалентны объявлению указанного beans с помощью <bean ... /> тег в XML. Эти типы bean будут придерживаться стандартных политик создания прокси.

@Configuration аннотация была разработана как замена файла конфигурации XML. Чтобы создать @Configuration аннотированный beans, Spring всегда будет использовать CGLIB для подкласса аннотированного класса @Configuration, переопределяя его аннотированный метод @Bean, чтобы заменить его методом поиска bean, чтобы сделать singleton beans создается только один раз. (Spring не использует CGLIB для перехвата внутренних вызовов метода из нормального Spring beans, вместо этого он создает отдельный экземпляр прокси (так же, как прокси-сервер JDK). Это позволяет использовать прокси, чтобы избежать мощности несоответствие - например, прокси-синглтон может получить текущий сеанс bean, что невозможно с наследованием класса.). Несмотря на это, аннотированные классы @Configuration все еще могут использовать аннотированные (@Autowired, @Inject и т.д.) Поля и свойства для запроса beans (и даже других @Configuration аннотированных beans тоже) из контейнера.

Пример из раздела 4.12.5 документации

@Configuration
public class AppConfig {

  @Bean
  public ClientService clientService1() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }
  @Bean
  public ClientService clientService2() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }

  @Bean
  public ClientDao clientDao() {
    return new ClientDaoImpl();
  }
}

в приведенном выше примере будет создан только один экземпляр ClientDao.

@Autowired - аннотация Spring, а @Inject - аннотация JSR-330. @Inject эквивалентен @Autowired или @Autowired(required=true), но вы не можете получить поведение @Autowired(required=false) с аннотацией JSR-330 @Inject. В этой аннотации всегда используется автоподключение по типу.

Spring значительно упрощает аннотацию JSR-250 @Resource. @Resource изначально был предназначен для размещения ресурсов JNDI в Java EE, но Spring расширяет его применимость, позволяя подключаться к любому bean в контейнере (ресурсы JNDI доступны как beans с помощью SimpleJndiBeanFactory). Имя соответствующего bean может быть указано как name атрибут @Resource аннотации, если имя не указано, тогда будет использовано имя аннотированного поля или свойства. Еще одна странная особенность заключается в том, что если не было найдено bean с именем свойства Spring, произойдет откат к проводке по типу.

Пример Представьте, что в контейнере есть AlphaClass bean с именем beanAlpha и beanBeta BetaClass bean.

@Resource 
BetaClass something;  // Wires to beanBeta - by-type

@Resource 
BetaClass beanAlpha;  // Will throw exception, because "beanAlpha" is not BetaClass -> it a bad idea to use @Resource as a replacement of @Autowired

@Resource 
Object beanAlpha;  //Wires to beanAlpha - by-name

Так что хорошая практика всегда указывать имя ресурса явно при использовании аннотации @Resource.

Documentation

Spring аннотации

Bean стандартные аннотации

обновить фиксированные ссылки JSR, как указал shevchik. Отдельные аннотации DI предоставляются JSR-330, который был разработан инженерами Google (Guice Framework) и SpringSource (Spring Framework). @Resource основан на JNDI и предоставляется JSR-250.

Ответ 2

@Component эквивалентно <bean>,
@Configuration эквивалентно <beans>.

Ответ 3

В большинстве приведенных выше ответов пользователи предлагают сказать, что @Component и @Configuration служат для разных целей. Но я не вижу, как это происходит на самом деле.

Но у меня есть простое приложение Spring MVC.

@Configuration
    public class SpringConfiguration {

@Bean
public  InternalResourceViewResolver initViewResolver(){
    InternalResourceViewResolver x = new InternalResourceViewResolver();
    x.setPrefix("/WEB-INF/jsp/");
    x.setSuffix(".jsp");
    return x;
}

}

Этот основной класс отлично работает, даже если он аннотируется как @Component вместо @Configuration.

Аналогично внутри класса, аннотированного как @Component, если у вас есть методы, аннотированные с помощью @ Bean, те beans создаются, когда контекст loaed.

Итак, я думаю, что для чтения кода мы должны отметить основной класс конфигурации как @Configuration и другие классы с @Component. Фактического исполнения мудрых нет никакой разницы.

Ответ 4

В разнице между @Autowired, @Inject и @Resource вы можете посмотреть здесь. Здесь вы можете подробное описание и сравнение.

Что касается первого отличия: @Configuration используется как замена для конфигурации XML, т.е. он маркирует классы как используемые для конфигурации Java, см. здесь. В свою очередь, @Component фактически используется для обозначения классов, поскольку те, которые должны быть созданы Spring и @Configuration, мета-аннотируются аннотацией @Component.

@Component и @Configuration служат для разных целей, поэтому сравнивать их не имеет смысла.

Ответ 5

1) Если вам нужна конфигурация XML, то игнорируйте @Configuration, так как это полезно только для конфигурации на Java. Конфигурация XML, вероятно, лучше всего для кого-то, незнакомого с Spring, поскольку есть больше доступных примеров.

@Компонентные аннотированные классы выбираются во время сканирования компонентов. Используйте их для маркировки классов, которые вы хотите показать как Spring beans. Опять же, вы можете просто объявить все свои beans в конфигурации XML и вообще игнорировать @Component.

2) Если вы счастливы связать свое приложение с Spring, используйте @Autowire, а не эквивалент javax @Inject. Я бы посоветовал, что лучший способ для запуска - принять зависимость от Spring.