aop及各种通知

  1. AOP
    即面向切面编程

    前置通知
    实现org.springframework.aop.MethodBeforeAdvice接口
    买书、评论前加系统日志

写一个购书和评论的接口IBookBiz.java

package com.hjc.aop.biz;

public interface IBookBiz {
	// 购书
	public boolean buy(String userName, String bookName, Double price);

	// 发表评论
	public void comment(String userName, String comments);
}

bookBizImpl.java实现IBookBiz.java接口

package com.hjc.aop.biz.impl;

import com.hjc.aop.biz.IBookBiz;
import com.hjc.aop.exception.PriceException;

public class BookBizImpl implements IBookBiz {

	public BookBizImpl() {
		super();
	}

	public boolean buy(String userName, String bookName, Double price) {
		// 通过控制台的输出方式模拟购书
		if (null == price || price <= 0) {
			throw new PriceException("book price exception");
		}
		System.out.println(userName + " buy " + bookName + ", spend " + price);
		return true;
	}

	public void comment(String userName, String comments) {
		// 通过控制台的输出方式模拟发表评论
		System.out.println(userName + " say:" + comments);
	}

}

添加系统日志

package com.hjc.aop.advice;

import java.lang.reflect.Method;
import java.util.Arrays;

import org.springframework.aop.MethodBeforeAdvice;

/**
 * 买书 评论前加系统日志
 * @author Administrator
 *
 */
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
		//获取到目标类的全路径及方法参数 把它们写到日志里去
		String target=arg2.getClass().getName();
		String methodName=arg0.getName();
		String args=Arrays.toString(arg1);
		
		System.out.println("前置系统日志:"+target+"."+methodName+"("+args+")被调用了");
	}

}

在spring-other.xml中利用目标和通知生成代理对象
在这里插入图片描述
测试

package com.hjc.aop.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hjc.aop.biz.IBookBiz;

public class AopTest {

	public static void main(String[] args) {
	ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-other.xml");
//	IBookBiz bean=(IBookBiz) applicationContext.getBean("BookBiz");
	IBookBiz bean=(IBookBiz) applicationContext.getBean("bookProxy");
	bean.buy("橙橙", "乖 摸摸头", 9.9);
	bean.comment("1橙橙", "记得双击么么哒");
		
	}

}

结果:
在这里插入图片描述

后置通知
	实现org.springframework.aop.AfterReturningAdvice接口
	买书返利(存在bug)

在spring-other.xml中生成代理对象
匹配spring 上下文
在这里插入图片描述
买书返利
实现org.springframework.aop.AfterReturningAdvice接口

package com.hjc.aop.advice;

import java.lang.reflect.Method;
import java.util.Arrays;

import org.springframework.aop.AfterReturningAdvice;
/**
 * 买书返利
 * @author Administrator
 *
 */
public class MyAfterReturningAdvice implements AfterReturningAdvice {

	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
		String target=arg3.getClass().getName();
		String methodName=arg1.getName();
		String args=Arrays.toString(arg2);
		
		System.out.println("后置通知:买书返利:"+target+"."+methodName+"("+args+")被调用了"+"该方法被调用的返回值为:"+arg0);
		
		
	}

}

测试:
在这里插入图片描述

环绕通知
		类似拦截器,会包括切入点,目标类前后都会执行代码。
org.aopalliance.intercept.MethodInterceptorj接口
package com.hjc.aop.advice;

import java.util.Arrays;

import org.aopalliance.intercept.MethodInvocation;

/**
 * 环绕通知
 * @author Administrator
 *
 */
public class MethodInterceptor implements org.aopalliance.intercept.MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		String target=arg0.getThis().getClass().getName();
		String methodName=arg0.getMethod().getName();
		String args=Arrays.toString(arg0.getArguments());
		
		System.out.println("环绕通知调用前:"+target+"."+methodName+"("+args+")被调用了");
		//proceed目标对象的方法
		Object proceed=arg0.proceed();
		System.out.println("环绕通知调用后:该方法被调用的返回值为"+proceed);
		return proceed;
	}

}

添加spring上下文
在这里插入图片描述
测试:
在这里插入图片描述

异常通知

	出现异常执行系统提示,然后进行处理。价格异常为例

实现org.springframework.aop.ThrowsAdvice接口

package com.hjc.aop.advice;

import org.springframework.aop.ThrowsAdvice;

import com.hjc.aop.exception.PriceException;
/**
 * 异常通知
 * @author Administrator
 *
 */
public class MyThrowsAdvice implements ThrowsAdvice {
	public void afterThrowing( PriceException ex ) {
		System.out.println("当价格出现错误时  执行此代码!!!!!!");
		
	}
	
	
	
}

异常通知 spring上下文
在这里插入图片描述
当价格出现空值 或者为负数的时候 会出现异常
在这里插入图片描述

过滤通知(适配器)
	org.springframework.aop.support.RegexpMethodPointcutAdvisor
	处理买书返利的bug

在这里插入图片描述
测试成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值