Аннотации Spring

Аннотации Spring позволяют нам настраивать зависимости и реализовывать внедрение зависимостей в программы на языке Java.

Аннотации Spring

  • Spring-фреймворк реализует и поддерживает принцип инверсии управления (IOC) или внедрения зависимостей (DI) и является контейнером IOC.
  • Традиционно Spring позволяет разработчику управлять зависимостями бинов с помощью конфигурации на основе XML.
  • Существует альтернативный способ определения бинов и их зависимостей. Этот метод основан на конфигурации на языке Java.
  • В отличие от подхода с использованием XML, Java-конфигурация позволяет управлять компонентами бинов программно. Вот почему были введены аннотации Spring.

В этой статье мы рассмотрим наиболее часто используемые аннотации Spring и также рассмотрим примеры программ.

Список аннотаций Spring

Некоторые из основных аннотаций фреймворка Spring следующие:

  1. @Configuration: Используется для указания того, что класс объявляет один или несколько методов @Bean. Эти классы обрабатываются контейнером Spring для создания определений бинов и обслуживания запросов на эти бины во время выполнения.

  2. `@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");
        }
    }
    
  3. @PreDestroy и @PostConstruct – альтернативный способ для initMethod и destroyMethod бина. Это можно использовать, когда класс бина определен нами. Например;

     public class Computer {
    
        @PostConstruct
        public void turnOn(){
            System.out.println("Загрузка операционной системы");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("Закрытие всех программ");
        }
    }
    
  4. @ComponentScan: Настраивает указания сканирования компонентов для использования с классами @Configuration. Здесь мы можем указать базовые пакеты для сканирования компонентов Spring.

  5. @Component: Указывает, что аннотированный класс является “компонентом”. Такие классы считаются кандидатами для автоопределения при использовании аннотационной конфигурации и сканирования classpath.

  6. @PropertySource: предоставляет простой декларативный механизм для добавления источника свойств в среду Spring. Существует аналогичная аннотация для добавления массива файлов источников свойств, например, @PropertySources.

  7. @Service: Обозначает, что аннотированный класс является “Сервисом”. Эта аннотация является специализацией @Component и позволяет автоматическое обнаружение классов реализации при сканировании пути классов.

  8. @Repository: Обозначает, что аннотированный класс является “Репозиторием”. Эта аннотация является специализацией @Component и рекомендуется использовать с классами DAO.

  9. @Autowired: Аннотация Spring @Autowired используется для автоматической инъекции бинов. Аннотация @Qualifier используется вместе с Autowired, чтобы избежать путаницы, когда у нас есть два или более бина, настроенных для одного типа.

Аннотации Spring MVC

Некоторые из важных аннотаций Spring MVC:

  1. @Controller
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @RequestBody и @ResponseBody
  7. @RequestHeader и @ResponseHeader

Вы можете узнать больше о них на учебнике Spring MVC.

Аннотации управления транзакциями Spring

@Transactional – это аннотация управления транзакциями в Spring, подробнее читайте на Spring MVC Hibernate.

Аннотации Spring Security

@EnableWebSecurity используется с классом @Configuration, чтобы определить конфигурацию Spring Security. Подробнее можно прочитать в примере Spring Security.

Аннотации Spring Boot

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

Подробнее можно прочитать в примере 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 готов к тестированию. В качестве краткого обзора, мы выполнили следующие шаги:

  1. Создали проект Maven и добавили необходимые зависимости Spring.
  2. Создали компонентные классы и внедрили свойства из ресурсного файла в их переменные.
  3. Если у нас есть сторонний компонент, мы можем использовать класс Service для внедрения зависимостей в него, так же, как мы сделали для OracleDriver через класс UserService.
  4. Наконец, мы создали класс 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