Spring Aspect强化通知
1、使用动态代理技术,完成如下业务。
使用一个代理对象,实现对普通售货员和普通服务员的代理
普通售货员具有挑选方法,问客户“购买什么商品”。要求代理对象在前边加入“您好,欢迎光临”字样。
普通售货员具有让客户扫码支付方法,“请扫码支付”。要求代理对象在后边加入“慢走,欢迎再来”字样。
普通服务员具有让客户点餐方法“请看一下菜单”。要求代理对象在前边加入“您好,欢迎光临”字样。
普通服务员具有让客户扫码支付方法,“请扫码支付”。要求代理对象在后边加入“请带好您的随身物品,慢走,欢迎再来”字样。
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"?> <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"> <parent> <artifactId>springFramework</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>day_05_job</artifactId> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.16</version> </dependency> </dependencies> </project>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> <context:component-scan base-package="com.xzit"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>