Подробное объяснение аннотаций @Autowired, @Resource и @Service

Spring
Подробное объяснение аннотаций @Autowired, @Resource и @Service

Как Spring собирает bean-компоненты перед аннотациями

Традиционный подход Spring заключается в использовании файлов .xml для внедрения bean-компонентов.Или настроить aop, transaction. Давайте сначала посмотрим на пример Spring, который не использует аннотации. На основе этого примера мы меняем его на версию аннотаций, чтобы мы могли видеть разницу между использованием и не использованием аннотаций. Сначала определим учителя:

public class Teacher{
    private String teacherName = "TW";
    public String toString() {
        return "TeacherName:" + teacherName;
    }
}

Определите другого ученика:

public class Student{
    private String studentName = "SL";
    public String toString() {
        return "StudentName:" + studentName;
    }
}

Затем определите школу:

public class School{
    private Teacher teacher;
    private Student student;
    public void setTeacher(Teacher teacher){
        this.teacher = teacher;
    }
    public void setStudent(Student student){
        this.student = student;
    }
    public Teacher getTeacher(){
        return teacher;
    }
    public Student getStudent(){
        return student;
    }
    public String toString(){
        return teacher + "\n" + student;
    }
}

Файл конфигурации весны выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<bean id="school" class="com.zxt.bean.School" >
    <property name="teacher" ref="teacher" />
    <property name="student" ref="student" />
</bean>
<bean id="teacher" class="com.zxt.uu.Teacher" />
<bean id="student" class="com.zxt.uu.Student" />

Это начальная конфигурация .xml, которая, очевидно, имеет два недостатка:

  1. Если все содержимое настроено в файле .xml, это приведет к тому, что файл .xml будет слишком большим; если вы разделите файлы .xml по требованию, это приведет к тому, что файл .xml будет слишком большим. Короче говоря, это сделает читаемость и ремонтопригодность файла конфигурации очень низкой.
  2. В разработке есть проблемы с переключением между файлами .java и файлами .xml. В то же время такое мышление также снизит эффективность развития.

Чтобы решить эти две проблемы, Spring представил аннотации через@注解名Таким образом, аннотации тесно интегрированы с Java Beans, что не только значительно уменьшает размер файлов конфигурации, но также повышает удобочитаемость и связность Java Beans.

@Autowired

Как следует из названия, это автопроводка. Его роль заключается в замене геттера/сеттера в коде Java и свойства в свойстве bean-компонента. Если частное свойство должно быть предоставлено извне, геттер должен быть зарезервирован. Введите аннотацию @Autowired, сначала посмотрите, как написать файл конфигурации spring:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
 3     xmlns="http://www.springframework.org/schema/beans"  
 4     xmlns:context="http://www.springframework.org/schema/context"  
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 9     
10     <context:component-scan base-package="com.zxt" />
11     
12     <bean id="school"  class="com.zxt.bean.School" />
13     <bean id="teacher" class="com.zxt.uu.Teacher" />
14     <bean id="student" class="com.zxt.uu.Student" />
15     
16 </beans>

Обратите внимание на строку 10, чтобы добиться автозагрузки bean-компонентов, сканер Spring должен быть настроен.

Укажите пакет в base-package:

<context:component-scan base-package=“com.zxt”/>

Указывает, что в пакете com.zxt и его подпакетах, если заголовок класса имеет определенную аннотацию@Component,@Repository,@Serviceили@Controller, объект будет внедрен в контейнер Spring как Bean.

См. строку 12, исходная школа должна быть введена с двумя атрибутами учитель и ученик, теперь нет необходимости вводить. Посмотрите еще раз, School.java тоже очень лаконичный, вы можете удалить геттер/сеттер:

public class School{
    @Autowired
    private Teacher teacher;
    @Autowired
    private Student student;
    public String toString(){
        return teacher + "\n" + student;
    }
}

здесь@AutowiredСмысл аннотации в том, что когда Spring находит@AutowiredПри аннотировании он автоматически найдет соответствующий bean-компонент в контексте кода (по умолчанию используется сопоставление типов) и автоматически вставит его в соответствующее место.

@Resource

Аннотация @Resource работает очень похоже на @Autowired. Сначала взгляните на @Resource и напишите School.java напрямую:

public class School{
    @Resource(name = "teacher")
    private Teacher teacher;
    @Resource(type = Student.class)
    private Student student;
    public String toString(){
        return teacher + "\n" + student;
    }
}

Это более подробное использование, давайте поговорим о порядке сборки @Resource:

  1. За @Resource нет содержимого. По умолчанию используется атрибут name для сопоставления с bean-компонентом. Если он не найден, он сопоставляется по типу.
  2. Если указано имя или тип, bean-компонент сопоставляется в соответствии с указанным типом.
  3. Если имя и тип указаны, компоненты сопоставляются в соответствии с указанным именем и типом, любое несоответствие приведет к ошибке.

Разница между аннотациями @Autowired и @Resource:

  1. @Auationired Bean по умолчанию выполняется в соответствии с сопоставлением BYTYPE Way, @ Resource Bean Default по умолчанию, проведенный в соответствии с Bynace Way Match
  2. @Autowired - это аннотация весны, @Resource - это аннотация J2EE, вы можете знать его в соответствии с именем пакета импортированной аннотации.
  3. Spring принадлежит третьей стороне, J2EE — собственная разработка Java. Поэтому рекомендуется использовать аннотацию @Resource, чтобы уменьшить связь между кодом и Spring.

@Service

Используя @Service, можно упростить настройку файла .xml.

Поскольку в файле конфигурации Spring все еще есть от 12 до 14 строк трех компонентов bean, применение тега автоматического сканирования в файле конфигурации Spring также может удалить эти три компонента, улучшить связность кода Java и еще больше уменьшить файл конфигурации. Сначала посмотрите на файл конфигурации:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
 3     xmlns="http://www.springframework.org/schema/beans"  
 4     xmlns:context="http://www.springframework.org/schema/context"  
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 9     
10     <context:component-scan base-package="com.zxt" />
11 </beans>

Файл конфигурации выглядит особенно освежающе. School.java, Teacher.java и Student.java изменяются следующим образом:

@Service 
public class School{ 
    @Autowired 
    private Teacher teacher; 
    @Autowired 
    private Student student; 
    public String toString(){ 
        return teacher + "\n" + student; 
    } 
} 
@Service 
public class Teacher{
    private String teacherName = "TW";
    public String toString() {
        return "TeacherName:" + teacherName;
    }
}
@Service
public class Student{
    private String studentName = "SL";
    public String toString() {
        return "StudentName:" + studentName;
    }
}

Таким образом, форма School.java в контейнере Spring — это «школа», которую можно передать черезApplicationContext的getBean("school")Способы получения School.java.

@Service Notes, на самом деле, делать две вещи:

  1. Объявить School.java компонентом. Это важно, потому что School.java — это bean-компонент, и другие классы могут использовать @Autowired для автоматического внедрения School в качестве переменной-члена.
  2. Идентификатор School.java в bean-компоненте — «school», то есть имя класса и первая буква в нижнем регистре.