English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SpringBoot AOP @AfterReturning

After returningЭто предложение в Spring AOP, которое обычно вызывается после выполнения точки подключения (выполнения). Если вызывается исключение, вызов не производится. Мы можем использовать @AfterReturning Комментарии реализуются в приложении после возврата предложений. Комментарии помечают функцию как предложение, которое должно быть выполнено перед методом, охваченным PointCut.

После выполнения совета, когда метод выполняется с нормальным возвращаемым значением, выполняется этот совет. Название, определенное в свойстве return, должно соответствовать имени параметра в методе совета. При возвращении значения метода это значение передается в качестве соответствующего значения параметра в метод уведомления.

Давайте реализуем通知 после возвращения в приложении.

SpringBoot AOP @AfterReturning

Шаг 1: Откройте Spring Initializr http://start.spring.io .

Шаг 2: предоставляет Группа Название. Мы предоставили имя группы com.w3codebox.

Шаг 3: предоставляет Artifact Id.Предоставляет Artifact Id aop-after-returning-advice-example.

Шаг 4: добавить Spring Web Зависимости.

Шаг 5: нажать Сгенерироватькнопка. При нажатии на кнопку "Создать" все нормы упаковываются в jar файл и загрузите его на локальную систему.

Шаг 6: Выгрузить

Шаг 7: Используйте следующие шаги для импортаПапка:

файл->Импорт->Существующий проект Maven->Далее->Перейти к папке Пример aop-returning-advice-example->Готово.

Шаг 8: Открыть pom.xml файл и добавьте следующее AOP Зависимости. Это использует Spring AOP и AspectJ Введение в面向方面的 программирование.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
<modelVersion>4.0.0</modelVersion>
<groupId>com.w3codebox</groupId>
<artifactId>aop-after-returning-advice-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>aop-after-returning-advice-example</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

Шаг 9: src/main/java папку Создать имя com.w3codebox.model в пакете.

Шаг 10: в пакете Создать объект с именем Account класса.

В классе "Account" выполните следующие действия:

определили два типа String переменных accountNumber и accountType . Щелкните правой кнопкой мыши файл -> Исходный код -> использовать поле для генерации конструктора Сгенерировать Getters.
Щелкните правой кнопкой мыши файл -> Source -> Generate Getters and Setters -> выберите Getters -> Generate
Сгенерировать toString()
Щелкните правой кнопкой мыши файл -> Исходный код -> сгенерировать toString()...

Account.java

package com.w3codebox.model;
public class Account 
{
    private String accountNumber;
    private String accountType;
    public Account(String accountNumber, String accountType) 
    {
        super();
        this.accountNumber = accountNumber;
        this.accountType = accountType;
    }
    public String getAccountType() 
    {
        return accountType;
    }
    public String getAccountNumber() 
    {
        return accountNumber;
    }
    @Override
    public String toString()
    {
        return "Account [accountNumber=" + accountNumber + ", accountType=" + accountType + "]";
    }
}

Шаг 11: Создайте еще один файл с именем пакет com.w3codebox.service.impl.

Шаг 12: В этом пакете создайте файл с именем Класс AccountServiceImple.

В этом классе мы определяем сервис счета.

AccountServiceImpl. Java

package com.w3codebox.service.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.stereotype.Service;
import com.w3codebox.model.Account;
@Service
public class AccountServiceImpl implements AccountService 
{
    //在 HashMap 中存储帐户细节
    private static Map<String,Account> map = null;
    static
    {
        map = new HashMap<>();
        //在map中添加帐户详细信息
        map.put("M4546779", new Account("10441117000", "Saving Account"));
        map.put("K2434567", new Account("10863554577", "Current Account"));
    }
    @Override
    public Account getAccountByCustomerId(String customerId) throws Exception
    {
    if(customerId == null)
    {
        throw new Exception("Invalid! Customer Id");
    }
    Account account= null;
    Set<Entry<String, Account>> entrySet = map.entrySet();
    for (Entry<String, Account> entry : entrySet) 
    {
        if(entry.getKey().equals(customerId))
        {
            account= entry.getValue();
        }
    }
    return account;
    }
}

步骤13: com.w3codebox.service.impl。包中创建名称为 AccountService 的接口。

AccountService.java

package com.w3codebox.service.impl;
import com.w3codebox.model.Account;
//正在创建一个接口,如果找不到客户id则引发异常
public interface AccountService 
{
    public abstract Account getAccountByCustomerId(String customerId) throws Exception;
}

Шаг 14: Создайте объект с именем пакета com.w3codebox.aspect.

Шаг 15: в пакете com.w3codebox.aspect в создании объекта с именем AccountAspect класса.

В этом классе мы используем аннотацию @AfterReturning. Мы также определили afterReturningAdvice()метод.

Внимание: Мы в определенному в name(account) > returning параметр должен соответствовать метод adviceсоответствуют именам параметров.

AccountAspect.java

package com.w3codebox.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import com.w3codebox.model.Account;
@Aspect
@Component
public class AccountAspect 
{
//implementing after returning advice   
@AfterReturning(value="execution(* com.w3codebox.service.impl.AccountServiceImpl.*(..))", returning="account")
public void afterReturningAdvice(JoinPoint joinPoint, Account account)
{
System.out.println("After Returning method:" + joinPoint.getSignature());
System.out.println(account);
}
}

Шаг 16: Открыть AopAfterReturningAdviceExampleApplication.java Файл и добавьте аннотацию @EnableAspectJAutoProxy.

Аннотация поддерживает обработку с помощью AspectJ @Aspect Компонент для комментариев. Он используется вместе с аннотацией @Configuration.

мы используем аннотацию @EnableAspectJAutoProxy proxyTargetClass параметр. Параметр proxyTargetClass = true позволяет нам использовать CGLIB (библиотека генерации кода) прокси, а не метод прокси по умолчанию, основанный на интерфейсе JDK.

ConfigurableApplicationContext является интерфейсом, который, помимо методов клиента контекста приложения ApplicationContext, предоставляет инструменты для конфигурации контекста приложения.

AopAfterReturningAdviceExampleApplication.java

package com.w3codebox;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import com.w3codebox.model.Account;
import com.w3codebox.service.impl.AccountService;
import com.w3codebox.service.impl.AccountServiceImpl;
@SpringBootApplication
//@EnableSpectProxy аналогичная аннотация поддерживает обработку компонентов, помеченных аннотацией @Aspect. Она аналогична тегу в xml-настройках.
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class AopAfterReturningAdviceExampleApplication
{
    public static void main(String[] args)  
    {
    ConfigurableApplicationContext ac = SpringApplication.run(AopAfterReturningAdviceExampleApplication.class, args);
    // Получить объект account из контекста приложения
    AccountService accountService = ac.getBean("accountServiceImpl", AccountServiceImpl.class);
    Account account;
    try 
    {
        account = accountService.getAccountByCustomerId("K2434567");
        if (account != null)
            System.out.println(account.getAccountNumber() + "\t" + account.getAccountType());
        } 
        catch (Exception e) 
        {
            System.out.println(e.getMessage());
        }
    }
}

После создания всех классов и пакетов структура каталога проекта будет выглядеть следующим образом:

Шаг 17: Открыть AopAfterReturningAdviceExampleApplication.java Файл и запуск его в качестве Java приложения. Это показывает вывод, как показано ниже:

В следующем разделе, после предложения, мы поймем.