为什么要使用AOP,在编写程序的时候,除了不必关心依赖的组件如何实现,在实际开发过程中,还需要将程序中涉及的公共问题集中解决。AOP是Aspect-Oriented Programming的简称,意思是面向切面编程。是对OOP的补充和完善,比如在开发中,所有的业务方法都需要日志记录、参数验证、事务处理,这些公共的处理如果放在每个业务方法中,系统会变的十分臃肿,即使写成公用类进行调用,也很难维护。散步在系统各处的需要在实现业务系统时关注的事情被称为“切面”,也称之为关注点,AOP的思想就是把这些公用部分从业务方法中提取出来,集中处理。

AOP将软件系统分为两个部分:核心关注点和横切关注点。术语:

1切面:Aspect:切面是系统中抽象出来的某一个模块。

2.连接点:JoinPoint:程序执行过程中某个特定的点,如调用某方法或处理异常时,在SpringAOP中,连接点总是代表着某个方法的执行。

3.通知:Advice:通知是切面具体实现,是放置”切面代码的“类。

4.切入点:PointCut:多个连接点组成一个切入点,可以使用切入点表达式表示。

5.目标对象:Target Object:包含一个连接点的对象,即被拦截的对象。

6.AOP代理:AOP Proxy:AOP框架产生的对象,是通知和目标对象的结合体。

7.织入:Weaving:将切入点和通知结合的过程称之为织入。

package com.sp.IC;

import com.sp.bean.OutOfStockException;

//手机业务接口
public interface PhoneBiz {
	public void buyPhone(int num);//购买手机;
	public void salePhone(int num) throws OutOfStockException;//销售手机
}
package com.sp.bean;

import com.sp.IC.PhoneBiz;

public class PhoneBizImpl implements PhoneBiz{
	//库存属性;
	int num=140;
	public void buyPhone(int num) {
		System.out.println("手机进货"+num+"部");
	}

	public void salePhone(int num) throws OutOfStockException{
		if(this.num<num){
			throw new OutOfStockException("库存不足,客户需要"+num+"部手机,库存只有"+this.num+"部");
		}
		System.out.println("手机销售"+num+"部");
	}
}

package com.sp.bean;

public class OutOfStockException extends Exception {
	//缺货异常;
	public OutOfStockException(String msg){
		super(msg);
	}
}
package com.sp.bean;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

//通知类;
public class LogAspect {
	//前置通知;
	public void before(JoinPoint jp)throws Throwable{
		Object[]args=jp.getArgs();	//目标方法所有参数;
		String methodName=jp.getSignature().getName();	//获得目标方法名称;

		if("buyPhone".equals(methodName)){
			System.out.println(currentTime()+"即将进行进货操作,数量为:"+args[0]);
		}
		if("salePhone".equals(methodName)){
			System.out.println(currentTime()+"即将进行销售操作,数量为:"+args[0]);
		}
	}
	//***********************后置通知***********************
	public void afterReturning(JoinPoint jp)throws Throwable{
		String methodName=jp.getSignature().getName();//获得签名方法的名字;
		if("buyPhone".equals(methodName)){
			System.out.println(currentTime()+"进货操作完毕");
		}
		if("salePhone".equals(methodName)){
			System.out.println(currentTime()+"销售操作完毕");
		}
	}
	public void after(JoinPoint jp)throws Throwable{
		String methodName=jp.getSignature().getName();
		if("buyPhone".equals(methodName)){
			System.out.println(currentTime()+"进货操作完毕,异常也要执行完毕的最终通知...");
		}
		if("salePhone".equals(methodName)){
			System.out.println(currentTime()+"销售操作完毕,异常也要执行完毕的最终通知...");
		}
	}
	//环绕通知;

	public Object aroundTest(ProceedingJoinPoint pjp)throws Throwable{
		String method=pjp.getSignature().getName();
		long begin=System.currentTimeMillis();//当前时间;
		System.out.println(currentTime()+":"+method+"方法开始执行,计时开始!");
		try {
			return pjp.proceed();
		}finally{
			long end=System.currentTimeMillis();
			System.out.println(currentTime()+":"+method+"方法执行完毕,耗时:"+(end-begin)+"毫秒");
		}
	}
	//***********************后置通知结束*********************
	public void afterThrowing(JoinPoint jp,OutOfStockException e){
		String methodName=jp.getSignature().getName();
		System.out.println(currentTime()+methodName+"方法执行,发生缺货异常"+e.getMessage());
	}
	//输出时间的方法;
	public String currentTime(){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
		return sdf.format(new Date());
	}
}

<?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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<!-- 目标业务对象 -->
	<bean id="phoneBiz" class="com.sp.bean.PhoneBizImpl"></bean>
	<!-- 日志管理切面类 -->
	<bean id="logAspectBean" class="com.sp.bean.LogAspect"></bean>
	<!-- Aop配置 -->
	<aop:config>
		<aop:pointcut expression="execution(void *Phone(int))" id="p1"/>
		<!-- 配置日志管理切面 -->
		<aop:aspect id="logAspect" ref="logAspectBean">
			<!-- 配置日志记录前置通知 -->
			<aop:before method="before" pointcut-ref="p1"/>
			<!-- 配置日志记录后置通知 -->
			<aop:after method="afterReturning" pointcut-ref="p1"/>
			<!-- 配置日志记录异常通知; -->
			<aop:after-throwing method="afterThrowing" pointcut-ref="p1" throwing="e"/>
			<!-- 配置日志记录最终通知 -->
			<aop:after method="after" pointcut-ref="p1"/>
			<!-- 配置日志记录环绕通知 -->
			<aop:around method="aroundTest" pointcut-ref="p1"/>
		</aop:aspect>
	</aop:config>
</beans>

Spring切面之一的更多相关文章

  1. spring切面-单线程简单权限判定

    spring切面简单模拟用户权限判定 需求: 游客:仅注册用户 用户:修改,注册 管理员:删除,查询,修改,注册 1,文件配置 导包 src下创建applicationContext.xml文件配置如 ...

  2. Spring 切面可以应用五种类型的通知?

    Spring 切面可以应用五种类型的通知: before:前置通知,在一个方法执行前被调用. after: 在方法执行之后调用的通知,无论方法执行是否成功. after-returning: 仅当方法 ...

  3. spring切面编程AOP 范例一

    参照网上的spring AOP编程实例进行配置,但是碰到了几个坑.这篇文章重点讲解一下我踩过的两个坑: 1.使用@Service自动装配的时候,基础扫描包配置要正确: 2.xml中切面配置中的exec ...

  4. Spring切面通知执行的顺序(Advice Order)

    问题描述 如果在Spring的程序中同时定义了环绕通知(Around)和前置通知(Before)..那么,有以下问题: 1.怎么让两个切面通知都起作用 2.或者让两者切面按自己指定的顺序进行执行? 3 ...

  5. Spring切面编程步骤

    什么是面向切面编程 面向对象的编程主要注重核心业务,而面向切面编程主要关注一些不是核心的业务,但又是必须的辅助功能,比如一个完整的系统中,记录平时系统运行时抛出的异常,需要我们去记录,以便我们对系统尽 ...

  6. 扩展Spring切面功能

    概述 Spring的切面(Spring动态代理)在Spring中应用十分广泛,例如还有事务管理,重试等等.网上介绍SpringAop源码很多,这里假设你对SpringAop有基本的了解.如果你认为Sp ...

  7. Spring切面编程实践【原创】

    定义 什么叫Spring面向切面编程(AOP),请自行百度,这边就不做详细介绍了. 场景 有两个对象,字典和工程信息Bean,每次新增或修改对象时,记录新增和修改的时间. 基类定义 package m ...

  8. 扩展Spring切面

    概述 Spring的切面(Spring动态代理)在Spring中应用十分广泛,例如还有事务管理,重试等等.网上介绍SpringAop源码很多,这里假设你对SpringAop有基本的了解.如果你认为Sp ...

  9. spring切面拦截实现

    1.建立业务类(英雄战斗实现类) package com.g2.api; public interface Weapon { int attack(); String getName(); } pac ...

  10. 《Java Spring框架》Spring切面(AOP)配置详解

    1.  Spring 基本概念 AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2 ...

随机推荐

  1. 关于C语言中内存的3个问题

    1.程序为什么需要内存? 计算机程序 = 代码 + 结果,从宏观上理解,代码就是动作,而数据被动作加工,最终返回结果.程序是被放在内存中运行的,并且需要内存来存储一些临时变量,因此,对于程序来说,内存 ...

  2. 180719-Quick-Task 动态脚本支持框架之使用介绍篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用介绍篇/ Quick-Task 动态脚本 ...

  3. fastCMS数据库相关操作类

    fastCMS针对数据库的操作有以下几个类: 1.[paging_Class]分页类 此类用于分页检索数据库内符合条件的记录 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left ...

  4. 基础的Servlet

    1.认识Servlet 今天接触了Servlet,我就写了这篇Servlet的文章.首先,我们了解一下Servlet是什么: 这是百度百科的解释,我个人理解是可以用来前后端交互的一个东西,例如可以实现 ...

  5. IO多路复用(二) -- select、poll、epoll实现TCP反射程序

    接着上文IO多路复用(一)-- Select.Poll.Epoll,接下来将演示一个TCP回射程序,源代码来自于该博文https://www.cnblogs.com/Anker/p/3258674.h ...

  6. linux ——使用find如何快速替换所有相同参数

    在生成环境上有时候需要大规模修改某一配置里的参数,但是该参数存在多个地方,比如IP地址 端口 项目名等,特别是项目名称混乱想统一 find  /项目地址 -type f |xargs grep &qu ...

  7. Fedora 26/27/28网易云音乐安装

    信息从 https://www.southcity-oldboy.com/1474.html获取,感谢站长南城旧少年! 以下为前辈网页上的内容 1.安装 RPM Fusion 源 (free): ht ...

  8. Alpha发布—文案+美工展示

    目录 团队简介 项目进展 组内分工 队员总结 后期计划 一.团队简介 二.项目进展 从选题发布到今天的Alpha发布,我们团队经历了许许多多的磨难.我们最终设计了如下的功能:首页.班级.个人.更多.打 ...

  9. 关于window.open弹出窗口被阻止的问题

    原文:http://blog.csdn.net/fanfanjin/article/details/6858168 在web编程过程中,经常会遇到一些页面需要弹出窗口,但是在服务器端用window.o ...

  10. Beta阶段冲刺第一天

    提供当天站立式会议照片一张 讨论项目每个成员的昨天进展 昨天开始了Beta阶段的冲刺,总体讨论了一下这个阶段的任务,然后明确了个人分工. 讨论项目每个成员的存在问题 第一天暂时还没有什么问题,可能最大 ...