Аннотации Spring @Autowired, @Qualifier, @Resource, @Value

Spring

предисловие Четыре аннотации @Autowired, @Qualifier, @Resource и @Value используются для ввода данных, и их функции такие же, как запись тега в теге bean-компонента в файле конфигурации xml! В этой статье основное внимание уделяется аннотации @Autowired.

1. Сначала устройте сцену

@Autowired комментарий, прежде чем говорить с данным сценарием:

код слоя дао

@Repository
public class AccountDao {
    public void save() {
        System.out.println("dao数据save成功了....");

    }
}

код сервисного уровня

@Service
public class AccountImpl implements AccountService {
    
    private AccountDao accountDao;

    @Override
    public void save() {
        accountDao.save();

    }
}

Код контроллера уровня представления:

//模拟一个表现层功能
public class AccountController {
    public static void main(String[] args) {
        //1.获取核心容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("Applicationcontext.xml");
        //2.根据id获取Bean对象
        AccountService as  = (AccountService)ac.getBean("accountImpl");
        as.save();
        System.out.println(as);
    }
}

результат операции

在这里插入图片描述
я верю всемjava.lang.NullPointerExceptionНулевые указатели исключения привыкли, особенно добрым ...

Так почему происходит это исключение? Очевидно, что его можно увидеть из кода, который имеет услугуAccountDaoИсключение нулевого указателя, вызванное тем, что атрибут типа не был введен, тогда на сцене появится аннотация @Autowired....

2. @Autowired

Spring 2.5 представила аннотацию @Autowired, которая может аннотировать переменные-члены класса, методы, конструкторы, параметры и т. д. [в основном используется вПеременнаяиметодOn], работа по автоматической сборке завершена. Используя @Autowired, чтобы исключить метод set, get,Другими словами, вставка данных атрибута с помощью аннотации @Autowired не требует, чтобы этот класс предоставлял метод set, что удобно и быстро..@AutowiredРоль аналогична написанию тега bean-компонента в файле конфигурации xml.< property >Этикетки работают так же.

в предыдущих статьяхКак использовать фабричный шаблон для разделения программ в Spring?, мы более или менее знаем, что нижний слой IOC Spring на самом деле являетсяMapСтруктура контейнера, так называемаяКлюч — это идентификатор в теге компонента, а значение — это класс в соответствующем теге компонента..

@Autowired сначала пропустит ключ в контейнере IOC и перейдет непосредственно к контейнеру, чтобы найти соответствующее свойство! То есть, это не имеет ничего общего с ключом.

Три случая автопроводки @Autowired:

1. В контейнере есть только один тип объекта bean, который соответствует типу переменной, измененной @Autowired, и внедрение может быть успешным! 2. Если ни один тип объекта bean-компонента в контейнере не соответствует типу переменной, измененной @Autowired, инъекция завершается неудачно и сообщается об ошибке. 3. Если в контейнере есть несколько типов объектов bean-компонентов, которые соответствуют типу переменной, измененному @Autowired, найдите имя переменной, измененное @Autowired, и, если оно будет найдено, внедрение будет успешным [Фокус

Многие люди будут игнорировать или не будут понимать третий пункт! ! !

3. @Квалификатор

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


    @Autowired //如果单纯一个@Autowired 注解则表示找类型为IAccuntDao的,如果有两个类型为IAccuntDao的,则接着匹配类型为IAccuntDao而且名字为accountDao的【缺点:要改变量名指定】
    @Qualifier("accountDao2") //加上这个注解直接找类型为IAccuntDao而且名字为accountDao2的
    private IAccuntDao accountDao;
    
    所以这段代码注解的意思就是直接找类型为IAccuntDao而且名字为accountDao的组件

Фактически приведенная выше аннотация эквивалентна следующей аннотации, о ней мы поговорим позже:

 @Resource("accountDao2")
 private IAccuntDao accountDao;

4. @Ресурс

@Resource предоставляется J2EE, по умолчанию вводится автоматически по имени (автоматически вводится по имени), @resource имеет два важных свойства, имя и тип, разумеется, по умолчанию, здесь свойство Type не обязательно, используйте Свойства типа Более одного, лучше использовать @Autowired, поэтому я буду помнить, чтобы имя автоматически вставлялось через имя.

5. Разница между @Autowired и @Resource

Надо сказать, что эти две аннотации очень похожи и их легко спутать.

Основные различия между @Autowired и @Resource заключаются в следующем:

@Autowired @Resource
Поставщик аннотаций Spring J2EE
Автоматический метод сборки Атрибуты название

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

Конечно, более важным моментом является:@Resource эквивалентен @Autowired + @Qualifier

6. @Значение

Поскольку @Autowired, @Qualifier, @Resource можно использовать только для данных, вводимых в другие типы bean-компонентов, а базовые типы и типы String не могут быть реализованы с использованием приведенных выше аннотаций. Поэтому с аннотацией @Value @Value специально используется для обслуживания базовых типов и типов String.

Кроме того, аннотация @Value имеет атрибут value: используется для указания значения данных. Он может использовать SpEL в Spring (то есть выражение Spring EL). Метод записи SpEL: ${expression}, конечно, он также может быть похож на метод записи #{expression} в mybatis.

@Value("#{2*3}")  //#写法 表示6
private int age;

@Value("178")    //普遍写法 178
private int height;

@Value("${man.weight}")  //SpEL的写法一般操作配置文件中数据
private int weight;

Примечание. Внедрение типа коллекции может быть выполнено только через XML.

7. Резюме

Вышеуказанные четыре аннотации @Autowired, @Qualifier, @Resource, @Value используются для ввода данных, и их функция такая же, как запись метки в теге bean-компонента в файле конфигурации xml!

Если эта статья поможет вам немного, то, пожалуйста, поставьте лайк, ваше одобрение — моя самая большая мотивация, спасибо~

Наконец, если есть какие-либо недостатки или неточности, добро пожаловать на исправления и критику, большое спасибо! Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение и ответьте как можно скорее!

Приглашаю всех обратить внимание на мою официальную учетную запись, там есть некоторые учебные материалы по Java и большая волна электронных книг по Java, таких как всесторонняя виртуальная машина Java г-на Чжоу Чжимина, идеи программирования Java, объемы основных технологий, большой разговор о дизайне. паттерны, борьба с параллельным программированием на Java... .. Это все библия Java, не говоря уже о том, чтобы садиться в машину Tomcat, поехали! Самое главное - вместе обсуждать технологии, тосковать по технологиям, заниматься технологиями, и когда это согласовано, это друг горшка ...

在这里插入图片描述