Аннотации Spring позволяют нам настраивать зависимости и реализовывать внедрение зависимостей в программы на языке Java.
Аннотации Spring
- Spring-фреймворк реализует и поддерживает принцип инверсии управления (IOC) или внедрения зависимостей (DI) и является контейнером IOC.
- Традиционно Spring позволяет разработчику управлять зависимостями бинов с помощью конфигурации на основе XML.
- Существует альтернативный способ определения бинов и их зависимостей. Этот метод основан на конфигурации на языке Java.
- В отличие от подхода с использованием XML, Java-конфигурация позволяет управлять компонентами бинов программно. Вот почему были введены аннотации Spring.
В этой статье мы рассмотрим наиболее часто используемые аннотации Spring и также рассмотрим примеры программ.
Список аннотаций Spring
Некоторые из основных аннотаций фреймворка Spring следующие:
-
@Configuration
: Используется для указания того, что класс объявляет один или несколько методов@Bean
. Эти классы обрабатываются контейнером Spring для создания определений бинов и обслуживания запросов на эти бины во время выполнения. -
`@Bean`: Указывает, что метод создает бин, управляемый контейнером Spring. Это одна из наиболее используемых и важных аннотаций Spring. `@Bean` аннотацию также можно использовать с параметрами, такими как name, initMethod и destroyMethod.
- name – позволяет задать имя для бина
- initMethod – позволяет выбрать метод, который будет вызван при регистрации контекста
- destroyMethod – позволяет выбрать метод, который будет вызван при завершении контекста
Например:
@Configuration public class AppConfig { @Bean(name = "comp", initMethod = "turnOn", destroyMethod = "turnOff") Computer computer(){ return new Computer(); } }
public class Computer { public void turnOn(){ System.out.println("Load operating system"); } public void turnOff(){ System.out.println("Close all programs"); } }
-
@PreDestroy
и@PostConstruct
– альтернативный способ для initMethod и destroyMethod бина. Это можно использовать, когда класс бина определен нами. Например;public class Computer { @PostConstruct public void turnOn(){ System.out.println("Загрузка операционной системы"); } @PreDestroy public void turnOff(){ System.out.println("Закрытие всех программ"); } }
-
@ComponentScan
: Настраивает указания сканирования компонентов для использования с классами @Configuration. Здесь мы можем указать базовые пакеты для сканирования компонентов Spring. -
@Component
: Указывает, что аннотированный класс является “компонентом”. Такие классы считаются кандидатами для автоопределения при использовании аннотационной конфигурации и сканирования classpath. -
@PropertySource
: предоставляет простой декларативный механизм для добавления источника свойств в среду Spring. Существует аналогичная аннотация для добавления массива файлов источников свойств, например,@PropertySources
. -
@Service
: Обозначает, что аннотированный класс является “Сервисом”. Эта аннотация является специализацией @Component и позволяет автоматическое обнаружение классов реализации при сканировании пути классов. -
@Repository
: Обозначает, что аннотированный класс является “Репозиторием”. Эта аннотация является специализацией @Component и рекомендуется использовать с классами DAO. -
@Autowired
: Аннотация Spring @Autowired используется для автоматической инъекции бинов. Аннотация @Qualifier используется вместе с Autowired, чтобы избежать путаницы, когда у нас есть два или более бина, настроенных для одного типа.
Аннотации Spring MVC
Некоторые из важных аннотаций Spring MVC:
- @Controller
- @RequestMapping
- @PathVariable
- @RequestParam
- @ModelAttribute
- @RequestBody и @ResponseBody
- @RequestHeader и @ResponseHeader
Вы можете узнать больше о них на учебнике Spring MVC.
Аннотации управления транзакциями Spring
@Transactional
– это аннотация управления транзакциями в Spring, подробнее читайте на Spring MVC Hibernate.
Аннотации Spring Security
@EnableWebSecurity
используется с классом @Configuration, чтобы определить конфигурацию Spring Security. Подробнее можно прочитать в примере Spring Security.
Аннотации Spring Boot
Подробнее можно прочитать в примере Spring Boot.
Пример аннотаций Spring
Давайте рассмотрим простой пример, в котором мы будем использовать аннотации Spring в нашем приложении. Ниже приведена иллюстрация моего проекта с примером аннотаций Spring.
Зависимости Spring Framework
I have created the maven project and added Spring Core Framework dependencies.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.journaldev.spring</groupId>
<artifactId>spring-annotations</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Spring Annotations</name>
<properties>
<spring.framework>4.3.0.RELEASE</spring.framework>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.framework}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.framework}</version>
</dependency>
</dependencies>
</project>
Это позволит подключить все необходимые библиотеки Spring для нашего проекта.
Классы компонентов
Следующий шаг – создать компонентные классы. Здесь я имитирую несколько компонентов базы данных, один для MySQL и другой для Oracle.
package com.journaldev.drivers;
public interface DataBaseDriver {
public String getInfo();
}
DataBaseDriver
– это базовый интерфейс, который мы реализуем.
package com.journaldev.drivers;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:mysqldatabase.properties")
public class MySqlDriver implements DataBaseDriver {
@Value("${databaseName}")
private String databaseName;
@Value("${disableStatementPooling}")
private String disableStatementPooling;
public String getInfo() {
return "[ Driver: mySql" +
", databaseName: " + databaseName +
", disableStatementPooling: " + disableStatementPooling +
" ]";
}
}
Обратите внимание на использование аннотации @Component
, чтобы указать фреймворку Spring обрабатывать этот класс как компонент. Мы также используем аннотации @PropertySource
и @Value
, Spring будет использовать их во время выполнения для внедрения и установки значений переменных из указанного файла свойств. Ниже приведены свойства, объявленные в файле mysqldatabase.properties
.
databaseName=school
disableStatementPooling=true
package com.journaldev.drivers;
public class OracleDriver implements DataBaseDriver {
protected String url;
protected String user;
protected String password;
protected String driver;
protected Integer port;
public String getUrl() {
return url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public void setUrl(String url) {
this.url = url;
}
public String getInfo() {
return "[ Driver: Oracle" +
", url: " + url +
", port; " + port +
", user: " + user +
", password: " + password +
", driver: " + driver +
" ] ";
}
}
OracleDriver
– это простой бин, мы будем использовать сервисный класс для внедрения свойств в этот бин.
Класс сервиса Spring
package com.journaldev.service;
import com.journaldev.drivers.DataBaseDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
@Qualifier("oracleDriver")
private DataBaseDriver dataBaseDriver;
public String getDriverInfo(){
return dataBaseDriver.getInfo();
}
}
Здесь мы используем аннотацию @Service
, чтобы указать фреймворку Spring обработать его как сервисный класс. Затем мы используем аннотации @Autowired
и @Qualifier("oracleDriver")
, чтобы сообщить фреймворку Spring внедрить бин с именем oracleDriver
в свойство класса dataBaseDriver
. Обратите внимание, что мы еще не создали этот бин Spring.
Бины Spring
Последний шаг – создать наши бины Spring и классы конфигурации, чтобы все это связать.
package com.journaldev.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.drivers.MySqlDriver;
import com.journaldev.drivers.OracleDriver;
@Configuration
@ComponentScan("com.journaldev")
@PropertySource("classpath:oracledatabase.properties")
public class AppConfig {
@Autowired
Environment environment;
@Bean
DataBaseDriver oracleDriver() {
OracleDriver oracleDriver = new OracleDriver();
oracleDriver.setDriver(environment.getProperty("db.driver"));
oracleDriver.setUrl(environment.getProperty("db.url"));
oracleDriver.setPort(Integer.parseInt(environment.getProperty("db.port")));
oracleDriver.setUser(environment.getProperty("db.user"));
oracleDriver.setPassword(environment.getProperty("db.password"));
return oracleDriver;
}
@Bean
DataBaseDriver mysqlDriver() {
return new MySqlDriver();
}
}
Обратите внимание на определение бина для oracleDriver
. В этом методе мы считываем свойства из файла oracledatabase.properties
, которое устанавливается в переменную environment
фреймворком Spring. Вот свойства, определенные в файле oracledatabase.properties
.
db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name
Наш проект примеров аннотаций Spring готов к тестированию. В качестве краткого обзора, мы выполнили следующие шаги:
- Создали проект Maven и добавили необходимые зависимости Spring.
- Создали компонентные классы и внедрили свойства из ресурсного файла в их переменные.
- Если у нас есть сторонний компонент, мы можем использовать класс Service для внедрения зависимостей в него, так же, как мы сделали для OracleDriver через класс UserService.
- Наконец, мы создали класс Configuration для определения бинов Spring и установили базовый пакет для сканирования компонентных классов Spring и их конфигурации.
Тестирование примера аннотаций Spring
Далее представлен основной класс для тестирования нашего проекта примеров аннотаций Spring.
package com.journaldev;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import com.journaldev.config.AppConfig;
import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.service.UserService;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);
DataBaseDriver oracle = appContext.getBean("oracleDriver", DataBaseDriver.class);
DataBaseDriver mysql = appContext.getBean("mysqlDriver", DataBaseDriver.class);
System.out.println("Oracle driver info:");
System.out.println(oracle.getInfo());
System.out.println("MySQL driver info:");
System.out.println(mysql.getInfo());
System.out.println("UserService Information");
UserService userService = appContext.getBean(UserService.class);
System.out.println(userService.getDriverInfo());
appContext.close();
}
}
На изображении ниже показан результат. Обратите внимание, что мы не настроили фреймворк логирования, поэтому все логирование фреймворка Spring выводится на консоль красным цветом. Это всё для краткого введения в аннотации Spring. Здесь перечислены самые важные аннотации, но есть еще много других для конкретных задач. Вы можете скачать мой проект примеров аннотаций Spring по ссылке ниже.
Скачать пример проекта с использованием аннотаций Spring
Ссылка: Документация API
Source:
https://www.digitalocean.com/community/tutorials/spring-annotations