Обзор аннотаций Spring

Spring Boot задняя часть Spring модульный тест

С Java 5.0 Java начал поддерживать аннотации. Как ведущие основы в java Ecosystem, весна также поддерживала аннотации с версии 2.5. По сравнению с использованием XML для настройки пружинной карки, использование аннотаций обеспечивает больше контроля над пружинной структурой.

Сейчас все больше и больше проектов используют аннотации для связанной конфигурации, но в Spring аннотаций очень много, я полагаю, что многие люди не очень хорошо разбираются в этих аннотациях, и многие никогда ими не пользовались. В этой статье мы попытаемся полностью представить часто используемые аннотации в Spring и сделать краткое введение.

1. Основные аннотации

@Required

Эта аннотация используется в методе установки компонента. Указывает, что это свойство является обязательным и должно быть введено на этапе настройки. В противном случае будет выброшено исключение BeanInitializationException.

@Autowired

Эта аннотация используется в полях компонента, методах установки и конструкторах для явного объявления зависимостей. Автопроводка по типу.

При использовании этой аннотации в поле и использовании атрибута для передачи значения Spring автоматически присваивает значение полю. Вы также можете использовать эту аннотацию для частных свойств (не рекомендуется) следующим образом.

@Component
public class User {
    @Autowired                               
    private Address address;                   
}

Наиболее распространенное использование — использовать эту аннотацию в установщике, чтобы можно было добавить пользовательский код в метод установщика. следующее:

@Component
public class User {
    private Address address;
    
    @AutoWired
   public setAddress(Address address) {        // custom code
      this.address=address;
   }
}

当在构造方法上使用此注解的时候,需要注意的一点就是一个类中只允许有一个构造方法使用此注解。此外,在Spring4.3后,如果一个类仅仅只有一个构造方法,那么即使不使用此注解,那么Spring也会自动注入相关的bean。 следующее:

@Component
public class User {
    private Address address;
    
     public User(Address address) {       
        this.address=address;
     }
}

<bean id="user" class="xx.User"/>

@Qualifier

Эта аннотация используется с @Autowired. Использование этой аннотации дает вам больше контроля над процессом впрыска.

@Qualifier можно использовать для одного параметра конструктора или метода. Когда в контексте есть несколько бинов одного типа, использование @Autowired не может отличить бин для привязки.В этом случае вы можете использовать @Qualifier для указания имени.

@Component
public class User {
    @Autowired
    @Qualifier("address1")
    private Address address;
    ...
}

@Configuration

Эта аннотация используется на классах, чтобы определить бобы. Его функция такая же, как файл конфигурации XML, указывающий, что этот компонент является конфигурацией пружины. Кроме того, этот класс может использовать аннотацию @Bean для инициализации бобов определения.

@Configuartion
public class SpringCoreConfig {
    @Bean
    public AdminUser adminUser() {
        AdminUser adminUser = new AdminUser();
        return adminUser;
    }
}

@ComponentScan

Эта аннотация обычно используется в сочетании с аннотацией @Configuration для указания пакета, который Spring сканирует на наличие аннотации. Если пакет не указан, пакет, в котором находится этот класс конфигурации, будет проверен по умолчанию.

@Lazy

Эта аннотация используется в классах компонентов Spring. По умолчанию зависимости Bean в Spring создаются и настраиваются с самого начала. Если вы хотите лениво инициализировать bean-компонент, вы можете использовать аннотацию Lazy для этого класса, чтобы указать, что bean-компонент будет создан и инициализирован только при первом использовании. Эту аннотацию также можно использовать в классах, аннотированных с помощью @Configuration, указывая, что все методы, аннотированные с помощью @Bean, будут инициализированы лениво.

@Value

Эта аннотация используется для полей, параметров конструктора и параметров метода. @Value может указывать выражение значения свойства. Он поддерживает использование SpringEL для получения значения через #{}, а также поддерживает использование ${} для ввода значения источника свойства (файл свойств, локальная переменная среды , системное свойство и т. д.) в свойствах компонента. Внедрение этой аннотации происходит в AutowiredAnnotationBeanPostProcessor.

2. Стереотипная аннотация

@Component

Эта аннотация используется в классе для объявления компонента Spring (Bean), добавляя его в контекст приложения.

@Controller

Эта аннотация используется для объявления того, что этот класс является контроллером Spring для класса, который является особой формой аннотации @Component.

@Service

Эта аннотация используется для класса, чтобы объявить, что этот класс является классом обслуживания, который выполняет бизнес-логику, вычисления, вызывает внутренние API и т. д. Это конкретная форма аннотации @Component.

@Repository

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

Эта аннотация имеет характеристики автоматического перевода: например, когда этот компонент выдает исключение, будет обработчик для обработки исключения без использования блока try-catch.

3. Аннотации Spring Boot

@EnableAutoConfiguration

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

@SpringBootApplication

Эта аннотация используется в основном классе приложения проекта Spring Boot (этот класс должен быть в базовом пакете). Классы, использующие эту аннотацию, сначала заставят компонент запуска Spring Boot сканировать классы в базовом пакете и его подпакетах.

Эта аннотация также добавляет следующие аннотации:

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

4. Spring Аннотации MVC и REST

@Controller

Эта аннотация была упомянута выше.

@RequestMapping

Эту аннотацию можно использовать в классах и методах для сопоставления веб-запросов с классом или методом обработчика. Когда эта аннотация используется в классе, создается базовый URL-адрес, и все @RequestMappings в его методах основаны на этом URL-адресе.

Вы можете использовать его атрибут метода, чтобы ограничить, какие http-методы соответствуют запросу.

@Controller
@RequestMapping("/users")
public class UserController {
    @RequestMapping(method = RequestMethod.GET)
    public String getUserList() {
        return "users";
    }
}

Кроме того, после Spring 4.3 был представлен ряд вариантов @RequestMapping. следующее:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @PatchMapping
  • @DeleteMapping

Они соответствуют конфигурации RequestMapping соответствующего метода.

@CookieValue

Эта аннотация используется в параметрах метода, объявленного @RequestMapping, для привязки файла cookie с соответствующим именем в файле cookie HTTP.

@ReuestMapping("/cookieValue")
   public void getCookieValue(@CookieValue "JSESSIONID" String cookie){
}

Файл cookie — это значение файла cookie, имя которого — JSESSIONID в HTTP-запросе.

@CrossOrigin

Эта аннотация используется в классах и методах для поддержки междоменных запросов и была введена после Spring 4.2.

CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/users")
public class AccountController {
    @CrossOrigin(origins = "http://xx.com")
    @RequestMapping("/login")
    public Result userLogin() {
        // ...
    }
}

@ExceptionHandler

Эта аннотация используется на уровне метода для объявления логики обработки исключения. Можно указать целевое исключение.

@InitBinder

Эта аннотация используется в методе для объявления инициализации WebDataBinder (привязка параметров запроса к DataBinder на JavaBean). Используйте эту аннотацию на контроллере, чтобы настроить привязку параметров запроса.

@MatrixVariable

Эта аннотация используется для параметра метода обработчика запросов, и Spring может вставить соответствующее значение в URL-адрес матрицы. Переменная матрицы здесь может появиться в любом месте URL-адреса, а переменные разделены знаком ;. следующее:

// GET /pets/42;q=11;r=22
@RequestMapping(value = "/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
    // petId == 42
    // q == 11
}

Следует отметить, что Spring mvc по умолчанию не поддерживает матричные переменные и должен быть включен.

<mvc:annotation-driven enable-matrix-variables="true" />

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

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
 
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

@PathVariable

Эта аннотация используется по параметрам метода обработчика запроса. @Requestmapping может определить динамические пути, такие как:

@RequestMapping("/users/{uid}")

Это можно связать с параметрами метода запроса, используя @PathVariable.

RequestMapping("/users/{uid}")
public String execute(@PathVariable("uid") String uid){
}

@RequestAttribute

Эта аннотация используется в параметрах метода обработчика запросов для привязки атрибутов в веб-запросе (атрибуты запроса, которые являются значениями атрибутов, размещенными сервером) с параметрами метода.

@RequestBody

Эта аннотация используется в параметре метода обработчика запросов для привязки карты тела http-запроса к этому параметру. HttpMessageConverter отвечает за преобразование объектов в HTTP-запросы.

@RequestHeader

Эта аннотация используется в параметре метода обработчика запросов для привязки значения заголовка HTTP-запроса к параметру.

@RequestParam

Эта аннотация используется в параметре метода обработчика запросов для привязки значения параметра HTTP-запроса к параметру.

@RequestPart

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

@ResponseBody

Этот метод обработчика аннотаций, используемый в запросе. И аналогичный эффект @RequestBody, метод для прямого вывода, чтобы вернуть HTTP-ответ объекта.

@ResponseStatus

Эта аннотация используется в методах и классах исключений для объявления кода состояния http, возвращаемого этим методом или классом исключений. Вы можете использовать эту аннотацию в контроллере, чтобы все @RequestMappings наследовались.

@ControllerAdvice

Эта аннотация используется в классах. Как упоминалось ранее, ExceptionMethod может быть объявлен для каждого контроллера. Здесь вы можете использовать @ControllerAdvice, чтобы объявить класс для единообразной обработки @ExceptionHandler, @InitBinder и @ModelAttribute для всех методов @RequestMapping.

@RestController

Эта аннотация используется в классе для объявления того, что контроллер возвращает не представление, а объект домена. Он также вводит две аннотации @Controller и @ResponseBody.

@RestControllerAdvice

Эта аннотация используется в классе, и вводятся две аннотации @ControllerAdvice и @ResponseBody.

@SessionAttribute

Эта аннотация используется в параметрах метода для привязки свойств в сеансе к параметрам.

@SessionAttributes

Эта аннотация используется на уровне типа для хранения объектов Javabean в сеанс. Обычно используется с аннотацией @Modelattribute. следующее:

@ModelAttribute("user")


public PUser getUser() {}
// controller和上面的代码在同一controller中
@Controller
@SeesionAttributes(value = "user", types = {
    User.class
})
public class UserController {}

5. Примечания к доступу к данным

@Transactional

Эта аннотация используется в определениях интерфейса, методах в интерфейсах, определениях классов или общедоступных методах в классах. Следует отметить, что эта аннотация не активирует транзакционное поведение, это просто метаданные, которые будут использоваться некоторой инфраструктурой времени выполнения.

6. Аннотации выполнения задач и планирования

@Scheduled

Эта аннотация используется для метода, чтобы объявить, что метод запланирован для планирования. Тип возвращаемого значения метода, использующего эту аннотацию, должен быть Void и не может принимать никаких параметров.


@Scheduled(fixedDelay=1000)
public void schedule() {
}

@Scheduled(fixedRate=1000)
public void schedulg() { 
}

Второй отличается от первого тем, что не ждет завершения выполнения последней задачи.

@Async

Эта аннотация используется для метода, чтобы объявить, что метод будет выполняться в отдельном потоке. В отличие от запланированной аннотации, эта аннотация может принимать параметры.

Тип возвращаемого значения метода, использующего эту аннотацию, может быть Void или возвращаемым значением. Но тип возвращаемого значения должен быть Future.

VII. Заметки об испытаниях

@ContextConfiguration

Эта аннотация используется в классе для объявления файла конфигурации, используемого тестом. Кроме того, вы также можете указать класс для загрузки контекста.

Эту аннотацию обычно необходимо использовать с SpringJUnit4ClassRunner.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringCoreConfig.class)
public class UserServiceTest {
}