Разница между аннотацией @Autowired и аннотацией @resource (очень подробно)

Java

задний план

Сегодня я увидел большой грузовик, возвращающийся с работы, поэтому я подумал о сборке, а затем в моей голове всплыла аннотация @Autowired (автоматическая сборка), поэтому я подумал, что аннотация @Resource использовалась для сборки в последнее время. рабочие проекты. Итак, в духе обучения всему, вы должны тренироваться до конца, чтобы превратиться из новичка в великого бога! ! Я провел серьезное исследование и резюмировал его здесь. В следующем содержании сначала объясняются две аннотации по отдельности, а затем обобщаются общие черты и различия.

@Autowired @Autowired — это аннотация, предоставляемая Spring, для которой необходимо импортировать пакет org.springframework.beans.factory.annotation.Autowired.

Стратегия, принятая @Autowired, заключается в внедрении по типу.

public class UserService {
    @Autowired
    private UserDao userDao; 
}

Как показано в приведенном выше коде, соберите его обратно в контейнер Spring, чтобы найти класс типа UserDao, а затем внедрите его. Это вызовет проблему. Когда тип имеет несколько значений bean-компонента, будет невозможно выбрать, какое из них вводить. В настоящее время нам нужно использовать его с @Qualifier.

@Qualifier сообщает Spring, какой объект нужно собрать.

public class UserService {
    @Autowired
    @Qualifier(name="userDao1")    
    private UserDao userDao; 
}

В это время мы можем найти объект, который мы хотим внедрить, по типу и имени.

@Resource

Аннотация @Resource предоставляется J2EE и требует импорта пакета javax.annotation.Resource.

@Resource автоматически внедряется в соответствии с ByName по умолчанию.

public class UserService {
    @Resource  
    private UserDao userDao; 
    @Resource(name="studentDao")  
    private StudentDao studentDao; 
    @Resource(type="TeacherDao")  
    private TeacherDao teacherDao; 
    @Resource(name="manDao",type="ManDao")  
    private ManDao manDao; 
}    

① Если указаны и имя, и тип, единственный соответствующий bean-компонент будет найден из контекста Spring для сборки, и если он не будет найден, будет выдано исключение.

② Если имя указано, компонент с совпадающим именем (id) будет искаться из контекста для сборки, и если он не будет найден, будет выдано исключение.

③ Если указан тип, найти аналогичный соответствующий уникальный компонент из контекста для сборки, если он не найден или найти более одного, будет выдано исключение.

④ Если ни имя, ни тип не указаны, он будет собран автоматически по методу byName, если нет совпадения, он вернется к примитивному типу для сопоставления, и если он совпадет, он будет собран автоматически.

Суммировать

Spring принадлежит третьей стороне, J2EE — собственная разработка Java. Использование @Resource уменьшает связь между вашим кодом и Spring.

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

Когда есть несколько типов, но они не указаны, будет сообщено о следующей ошибке:

严重: Exception sendingcontext initialized event to listener instance of classorg.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating beanwith name 'sequenceServiceImpl': Injection of resource dependencies failed;nested exception isorg.springframework.beans.factory.NoUniqueBeanDefinitionException: Noqualifying bean of type