Spring Aspect强化通知


1、使用动态代理技术,完成如下业务。

   使用一个代理对象,实现对普通售货员和普通服务员的代理

   普通售货员具有挑选方法,问客户“购买什么商品”。要求代理对象在前边加入“您好,欢迎光临”字样。

   普通售货员具有让客户扫码支付方法,“请扫码支付”。要求代理对象在后边加入“慢走,欢迎再来”字样。

   普通服务员具有让客户点餐方法“请看一下菜单”。要求代理对象在前边加入“您好,欢迎光临”字样。

   普通服务员具有让客户扫码支付方法,“请扫码支付”。要求代理对象在后边加入“请带好您的随身物品,慢走,欢迎再来”字样。

2、使用AOP环绕通知完成如下业务。

   在一个properties文件中,配置多个疫情高风险区域地址。

   制作一个用户出行校验系统。系统出行方法中显示如下信息“您好,XXX,欢迎您乘坐从XX地到XX地航班”。

   要求使用环绕通知,对用户出发地和目的地进行是否高风险排查。如果用户出发地为高风险区域,则不允许用户出行,给出高风险提示。如果用户目的地为高风险区域,则要生成日志系统,记录用户姓名、出发地、目的地及出发时间。

package com.xzit.model;

import com.xzit.adapter.UserService;
import org.springframework.stereotype.Component;

@Component
public class Saler{
    public void showMenu(){
        System.out.println("购买什么商品?");
    }
    public void pay(){
        System.out.println("请扫码支付。");
    }
}
package com.xzit.model;

import com.xzit.adapter.UserService;
import org.springframework.stereotype.Component;

@Component
public class Waiter{
    public void showMenu(){
        System.out.println("请看一下菜单。");
    }
    public void pay(){
        System.out.println("请扫码支付。");
    }
}
package com.xzit.util;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 通知(增强)
 */
//让当前的通知类作为spring容器中的组件
@Component
//使用AspectJ来实现AOP
@Aspect
public class MyAdvice {
    //前置通知
    @Before(value = "execution(* com.xzit.model.Saler.showMenu(..))")
    public void doBefore(){
        System.out.println("您好,欢迎光临");
        System.out.println("-----------------");
    }

    //最终通知 try finally
    @After(value = "execution(* com.xzit.model.Saler.pay(..))")
    public void doAfer(){
        System.out.println("慢走,欢迎再来");
        System.out.println("-----------------");
    }

    //前置通知
    @Before(value = "execution(* com.xzit.model.Waiter.showMenu(..))")
    public void doBefore2(){
        System.out.println("您好,欢迎光临");
        System.out.println("-----------------");
    }

    //最终通知 try finally
    @After(value = "execution(* com.xzit.model.Waiter.pay(..))")
    public void doAfer2(){
        System.out.println("请带好您的随身物品,慢走,欢迎再来");
        System.out.println("-----------------");
    }
}
package com.xzit.test;

import com.xzit.model.Saler;
import com.xzit.model.Waiter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestAOP {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Saler saler = context.getBean(Saler.class);
        Waiter waiter = context.getBean(Waiter.class);
        saler.showMenu();
        System.out.println("+++++++++++++++++++++++++++");
        saler.pay();
        System.out.println("+++++++++++++++++++++++++++");
        waiter.showMenu();
        System.out.println("+++++++++++++++++++++++++++");
        waiter.pay();
    }
}
<?xml version="1.0" encoding="UTF-8"?>

         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">
    
        springFramework
        org.example
        1.0-SNAPSHOT
    
    4.0.0

    day_05_job

    
        11
        11
    
    
        
            org.springframework
            spring-aspects
            5.3.16
        
    
<?xml version="1.0" encoding="UTF-8"?>

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       https://www.springframework.org/schema/aop/spring-aop.xsd">
    package="com.xzit">