Поиск по сайту:

Весенние аннотации


Spring Annotations позволяет нам настраивать зависимости и внедрять внедрение зависимостей через java-программы.

Весенние аннотации

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

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

Список весенних аннотаций

Вот некоторые из основных аннотаций Spring Core:

  1. @Configuration: Used to indicate that a class declares one or more @Bean methods. These classes are processed by the Spring container to generate bean definitions and service requests for those beans at runtime.

  2. @Bean: Indicates that a method produces a bean to be managed by the Spring container. This is one of the most used and important spring annotation. @Bean annotation also can be used with parameters like name, initMethod and destroyMethod.

    • name – allows you give name for bean
    • initMethod – allows you to choose method which will be invoked on context register
    • destroyMethod – allows you to choose method which will be invoked on context shutdown

    For example:

    @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 and @PostConstruct are alternative way for bean initMethod and destroyMethod. It can be used when the bean class is defined by us. For example;

     public class Computer {
    
        @PostConstruct
        public void turnOn(){
            System.out.println("Load operating system");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("Close all programs");
        }
    }
    
  4. @ComponentScan: Configures component scanning directives for use with @Configuration classes. Here we can specify the base packages to scan for spring components.

  5. @Component: Indicates that an annotated class is a “component”. Such classes are considered as candidates for auto-detection when using annotation-based configuration and classpath scanning.

  6. @PropertySource: provides a simple declarative mechanism for adding a property source to Spring’s Environment. There is a similar annotation for adding an array of property source files i.e @PropertySources.

  7. @Service: Indicates that an annotated class is a “Service”. This annotation serves as a specialization of @Component, allowing for implementation classes to be autodetected through classpath scanning.

  8. @Repository: Indicates that an annotated class is a “Repository”. This annotation serves as a specialization of DAO classes.

  9. @Autowired: @Qualifier annotation is used in conjunction with Autowired to avoid confusion when we have two of more bean configured for same type.

Весенние аннотации MVC

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

  1. @Контроллер
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @ResponseBody
  7. @ResponseHeader

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

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

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

Аннотации безопасности Spring

@EnableWebSecurity используется с примером безопасности Spring.

Аннотации Spring Boot

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

Подробнее читайте в примере Spring Boot.

Пример весенних аннотаций

Зависимости Spring Framework

Я создал проект maven и добавил зависимости Spring Core Framework.

<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>

Это подтянет все банки пружинного сердечника для нашего проекта.

Классы компонентов

Следующим шагом является создание классов компонентов. Здесь я имитирую несколько компонентов базы данных, один для 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 Framework должен рассматривать этот класс как компонент. Мы также используем аннотации @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 — это простой bean-компонент, мы будем использовать сервисный класс для внедрения свойств в этот bean-компонент.

Весенний класс обслуживания

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 framework внедрить bean-компонент с именем oracleDriver в свойство класса драйвер базы данных. Обратите внимание, что мы еще не создали этот spring bean-компонент.

Весенние бобы

Последний шаг — создать наши Spring bean-компоненты и классы конфигурации, чтобы склеить все вместе.

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, для которого среда Spring устанавливает переменную environment. Вот свойства, определенные в файле oracledatabase.properties.

db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name

Наш пример проекта весенних аннотаций готов к тестированию. Подводя итог, мы выполнили следующие шаги:

  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 Annotations

Ссылка: документ API