计算机视觉技术 wordpress Finder 反射 哨兵模式 Gradle curl vector cmd interface yii2 网校直播系统 一兆等于多少字节 mysql将时间戳转换成日期 python在线教程 python中index的用法 python传参 java的数据类型 java学习课程 java怎么编程 vb编程 php实例教程 linux格式化命令 linux端口映射 视频解析软件 淘宝图片下载 xmind画流程图 设备管理器在哪 剑灵邪魔铃怎么获得 allowtransparency 固态硬盘有什么用 a1530是什么版本 ps怎么修证件照 齐论工具箱 maya骨骼绑定 ps文字旋转任意角度 微信骰子控制 投屏软件电脑版 pr怎么加字幕特效 什么是内存条
当前位置: 首页 > 学习教程  > 编程语言

Spring AOP实现原理实例

2020/9/19 14:43:11 文章标签:

一、AOP

二、AOP相关概念:
切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。
连接点(Joinpoint) :程序执行过程中的某一行为。
通知(Advice) :“切面”对于某个“连接点”所产生的动作。
切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。
目标对象(Target Object) :被一个或者多个切面所通知的对象。
AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。

spring aop通知(advice)分成五类:
前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[After throwing advice]:在连接点抛出异常后执行。
返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

三、实例Demo
核心代码是红色框内容,其它请忽略
在这里插入图片描述

BeanUtil.java

package com.aop;

import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class BeanUtil {
	public static Object getBean(String beanName) {
		return new ClassPathXmlApplicationContext("spring-bean.xml").getBean(beanName);
	}
}

MyAdvice.java

package com.aop;

import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
 
public class MyAdvice {
 
	/**
	 * 前置通知
	 * @param joinpoint
	 */
	public void before() {
		System.out.println("前置通知-----------before");
	}
	/**
	 * 后置通知
	 */
	public void after() {
		System.out.println("后置通知-----------after");
	}
	/**
	 * 引入通知
	 */
	public void afterReturning() {
		System.out.println("引入通知-----------afterReturning");
	}
	/**
	 * 环绕通知
	 */
	public void around(ProceedingJoinPoint joinpoint) {
		System.out.println("环绕通知-----------around开始");
		try {
			joinpoint.proceed();
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("环绕通知-----------around结束");
	}
	/**
	 * 异常通知
	 */
	public void afterThrowing() {
		System.out.println("异常通知-----------afterThrowing");
	}
	
}

UserService.java

package com.aop;

public interface UserService {
	
	public void print();
 
}

UserServiceImpl.java

package com.aop;
 
public class UserServiceImpl implements UserService{
 
	@Override
	public void print() {
		System.out.println("执行打印。。。。。。。。。。。。。");
	}
}

单元测试类UserAction.java

package com.test;

import static org.junit.Assert.*;
import org.junit.Test;
import com.aop.BeanUtil;
import com.aop.UserService;

 
public class UserAction {
	
	private UserService userService;	
	
	@Test
	public void test() {
		
		userService = (UserService) BeanUtil.getBean("userService");	
		userService.print();
	}
}

执行结果如下:
在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_200158.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?