aop( Aspect-Oriented Programming)前置通知原理案例讲解
编程步骤;
- 定义接口
- 编写对象(被代理的对象即目标对象)
- 编写通知(前置通知即目标方法调用前调用)
- 在beans.xml文件中配置
4.1. 配置 被代理对象即目标对象
4.2. 配置通知
4.3. 配置代理对象 其是ProxyFactoryBean的对象实例
4.3.1 配置代理接口集
4.3.2 织入通知
4.3.3 配置被代理对象
直接上代码
1.分别创建两个接口如下:
TestServiceInterface.java接口
1 package com.LHB.aop;2 3 public interface TestServiceInterface {4 5 public void sayHello();6 }
TestServiceInterface2.java接口
1 package com.LHB.aop;2 3 public interface TestServiceInterface2 {4 5 public void sayBye();6 }
2. 创建被代理对象(目标对象)类testService.java,该类实现了TestServiceInterface和TestServiceInterface2两个接口方法
1 package com.LHB.aop; 2 3 public class testService implements TestServiceInterface,TestServiceInterface2 { 4 5 private String name; 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) {10 this.name = name;11 }12 @Override13 public void sayHello() {14 // TODO Auto-generated method stub15 16 System.out.println("hello " + name);17 }18 @Override19 public void sayBye() {20 // TODO Auto-generated method stub21 System.out.println("Bye "+ name);22 }23 24 }
3. 编写前置通知即MyMethodBeforeAdvice.java,该类实现了MethodBeforeAdvice接口中的before(method method,Object[] args,Object target )方法。
注意:在实现该接口的时候需要导入spring-aop-5.0.1.RELEASE.jar包(本案例在spring5.0.1版本下实现的)
1 package com.LHB.aop; 2 3 import java.lang.reflect.Method; 4 5 import org.springframework.aop.MethodBeforeAdvice; 6 7 public class MyMethodBeforeAdvice implements MethodBeforeAdvice { 8 9 /**10 * 功能:该函数将在目标函数执行前首先执行11 * method:被调用方法名字12 * args:给method传递的参数13 * target:被代理的目标对象14 */15 @Override16 public void before(Method method, Object[] args, Object target)17 throws Throwable {18 // TODO Auto-generated method stub19 //method.getName()方法将得到目标函数的函数名称20 System.out.println("记录日志...." + method.getName());21 }22 23 }
4.通过new/File新建一个bean.xml配置文件,开始配置前置通知
1 29 10 11 12 14 1513 16 17 18 19 34 3520 25 2621
24com.LHB.aop.TestServiceInterface 22com.LHB.aop.TestServiceInterface2 2327 28 30 31MyMethodBeforeAdvice 2932 33
5. 创建一个测试类APP
1 package com.LHB.aop; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class App { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub10 ApplicationContext ac = new ClassPathXmlApplicationContext("com/LHB/aop/beans.xml");11 TestServiceInterface tsi = (TestServiceInterface) ac.getBean("ProxyFactoryBean");12 tsi.sayHello();13 ((TestServiceInterface2)tsi).sayBye();14 15 }16 17 }
6. 运行结果