Оба аннотации @Autowired и @Resource используются для внедрения зависимостей (dependency injection) в Spring, но они имеют разные особенности и поведение. Давайте разберем их отличия подробно.
@Autowired: Это аннотация Spring Framework. Она является частью Spring и используется для автоматического связывания бинов.@Resource: Это аннотация из стандарта JSR-250 (Java Specification Request). Она не является частью Spring, но поддерживается Spring для совместимости с другими Java EE контейнерами.@Autowired: Использует тип (by type) для внедрения зависимостей. Если Spring находит несколько бинов одного типа, он может использовать @Qualifier для уточнения, какой именно бин нужно внедрить.import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyService {
@Autowired
@Qualifier("myRepository")
private MyRepository repository;
}
@Resource: Использует имя (by name) для внедрения зависимостей. Если имя не указано, оно будет искать бин по типу.import javax.annotation.Resource;
public class MyService {
@Resource(name = "myRepository")
private MyRepository repository;
}
@Autowired: По умолчанию является обязательной (required = true). Если бин не найден, Spring выбросит исключение. Это поведение можно изменить, установив required = false.import org.springframework.beans.factory.annotation.Autowired;
public class MyService {
@Autowired(required = false)
private MyRepository repository;
}
@Resource: Также является обязательной по умолчанию. Если бин не найден, будет выброшено исключение. Однако, в отличие от @Autowired, здесь нет возможности изменить это поведение через аннотацию.@Autowired: Может использоваться для внедрения через поля, сеттеры и конструкторы.import org.springframework.beans.factory.annotation.Autowired;
public class MyService {
private MyRepository repository;
@Autowired
public MyService(MyRepository repository) {
this.repository = repository;
}
}
@Resource: Обычно используется для внедрения через поля и сеттеры. Не поддерживает внедрение через конструкторы.import javax.annotation.Resource;
public class MyService {
@Resource
private MyRepository repository;
@Resource
public void setRepository(MyRepository repository) {
this.repository = repository;
}
}
@Autowired: Может использоваться вместе с @Qualifier для уточнения, какой именно бин нужно внедрить, если есть несколько бинов одного типа.import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyService {
@Autowired
@Qualifier("myRepository")
private MyRepository repository;
}
@Resource: Использует атрибут name для указания имени бина, что делает использование @Qualifier излишним.import javax.annotation.Resource;
public class MyService {
@Resource(name = "myRepository")
private MyRepository repository;
}
@Autowired является аннотацией Spring и использует тип для внедрения зависимостей. Она поддерживает внедрение через поля, сеттеры и конструкторы, а также может быть настроена как необязательная.@Resource является частью стандарта JSR-250 и использует имя для внедрения зависимостей. Она поддерживает внедрение через поля и сеттеры, но не через конструкторы, и всегда является обязательной.Выбор между @Autowired и @Resource зависит от конкретных требований вашего проекта и предпочтений разработчика. Если вам нужно больше гибкости и интеграция с Spring, используйте @Autowired. Если важна совместимость с другими Java EE контейнерами, выбирайте @Resource.