Spring的AOP

AOP术语

  1. Target(目标对象): 需要增强的方法所在类的实例
  2. Joinpoint(连接点): 目标对象中的所有方法都叫连接点
  3. Pointcut(切入点): 需要增强的方法,即连接点中的某一些方法
  4. advice(通知/增强): 切点执行前打印日志,打印日志这个行为就叫做增强
  5. Aspect(切面): 由切点和增强组成的切面类,增强就是切面类中的一个方法
  6. Weaving(织入): 把增强应用到目标对象来创建新的代理对象的过程
  7. Proxy(代理): 一个类被AOP织入增强后,就产生一个结果代理类
  8. Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field

1. 导入jar包

创建JavaWEB项目,引入具体的开发的jar包
	* 先引入Spring框架开发的基本开发包
	* 再引入Spring框架的AOP的开发包
		* spring的传统AOP的开发的包
			* spring-aop-4.2.4.RELEASE.jar
			* com.springsource.org.aopalliance-1.0.0.jar
		
		* aspectJ的开发包
			* com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
			* spring-aspects-4.2.4.RELEASE.jar

2. 创建目标对象

package com.daben.service.impl;

import com.daben.service.IUserService;

public class UserServiceImpl implements IUserService {

	@Override
	public void save() {
		System.out.println("保存用户...");
		
	}

	@Override
	public void update() {
		System.out.println("更新用户...");
		
	}
}

3. 创建切面类

package com.daben.aspect;

public class MyAspect {
	public void log() {
		System.out.println("打印日志...");
	}
}

4. 创建配置文件

在src目录下创建applicationContext.xml文件,内容如下:

<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
        <!-- 目标对象 -->    
	<bean name="userService" class="com.daben.service.impl.UserServiceImpl"></bean>
	<!-- 切面类 -->
	<bean name="myAspect" class="com.daben.aspect.MyAspect"></bean>
	<!-- 织入 -->
	<aop:config>
		<!-- 配置切面类 -->
		<aop:aspect ref="myAspect">
			<!-- 增强 + 切入点 -->
			<!-- 切入点表达式(execution(public * com.daben.service.impl.UserServiceImpl.save())) -->
			<aop:before method="log" pointcut="execution(public * com.daben.service.impl.UserServiceImpl.save())"/>
		</aop:aspect>
	</aop:config>
</beans>

切入点表达式

<aop:before method="log" pointcut="execution(public void com.daben.service.impl.UserServiceImpl.save())"/>
<!-- public 可以省略不写 -->
<aop:before method="log" pointcut="execution(void com.daben.service.impl.UserServiceImpl.save())"/>
<!-- void,返回值可以出现 * 表示任意的返回值,返回值类型不能不写 -->
<aop:before method="log" pointcut="execution(* com.daben.service.impl.UserServiceImpl.save())"/>
<!-- 包名可以使用 * 代替,不能不写 -->
<aop:before method="log" pointcut="execution(* com.daben.service.*.UserServiceImpl.save())"/>
<!-- 包名的简写的方式,任意的包名的结构*..* -->
<aop:before method="log" pointcut="execution(* *..*.UserServiceImpl.save())"/>
<!-- 编写类名的写法,*Impl匹配类名以Impl结束的类 -->
<aop:before method="log" pointcut="execution(* *..*.*Impl.save())"/>
<!-- 方法名编写,save*,匹配以save开头的方法名 -->
<aop:before method="log" pointcut="execution(* *..*.*Impl.save*())"/>
<!-- 参数列表:出现一个*,表示一个参数,多个参数参数使用 .. -->
<aop:before method="log" pointcut="execution(* *..*.*Impl.save*(*))"/>

AOP的通知类型

1. 前置通知
	* 在目标类的方法执行之前执行。
	* 配置文件信息:<aop:after method="before" pointcut-ref="myPointcut3"/>
	* 应用:可以对方法的参数来做校验

2. 最终通知
	* 在目标类的方法执行之后执行,如果程序出现了异常,最终通知也会执行。
	* 在配置文件中编写具体的配置:<aop:after method="after" pointcut-ref="myPointcut3"/>
	* 应用:例如像释放资源

3. 后置通知
	* 方法正常执行后的通知。		
	* 在配置文件中编写具体的配置:<aop:after-returning method="afterReturning" pointcut-ref="myPointcut2"/>
	* 应用:可以修改方法的返回值

4. 异常抛出通知
	* 在抛出异常后通知
	* 在配置文件中编写具体的配置:<aop:after-throwing method="afterThorwing" pointcut-ref="myPointcut3"/>	
	* 应用:包装异常的信息

5. 环绕通知
	* 方法的执行前后执行。
	* 在配置文件中编写具体的配置:<aop:around method="around" pointcut-ref="myPointcut2"/>
	* 要注意:目标的方法默认不执行,需要使用ProceedingJoinPoint对来让目标对象的方法执行。

声明:
有一些博文是看的黑马程序员视频,然后跟着老师做的笔记
Spring是跟子路老师学的
特此感谢,写这些文章的目的是为了自己方便查阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值