Spring框架分享第二篇AOP(面向切面编程)

一、AOP核心思想
AOP是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。

在这里插入图片描述二、每个概念的含义
AOP 面向切面编程
aspect :切面/切面类, 从多个业务中被抽离出来,功能相同的类。
joinPoint 连接点:在spring的aop中只有 类中的方法 可以做连接点,每一个方法都可以是一个连接点。
pointCut 切入点 一组连接点的集合
advice 通知/拦截器 用来控制切面类将来到底是织入到切入点的前面、后面或者是抛异常的时候。
adivsor 增强器用来筛选类中的哪些方法是我们的连接点(哪些方法需要被拦截).
target 目标对象
proxy 代理对象
wave 织入
在这里插入图片描述advice(通知)的类型:
前置通知(Before advice): 在某些连接点(join point)之前执行的通知
返回后通知(After returning advice): 在某些连接点(join point)正常完成后执行的通知(方法正常结束,没有异常)
抛出异常后通知(After throwing advice): 在某些连接点(join point)抛出异常退出时执行的通知
后通知(After (finally) advice): 当某些连接点(join point)退出的时候执行的通知
环绕通知(Around Advice): 包围一个连接点(join point)的通知,例如事务的处理,就需要这样的通知,因为事务需要在方法前开启,在方法后提交,以及方法抛出异常时候回滚
注:在spring中,连接点(join point)指的就是方法
三、如何使用advice
在Spring中,Advice是由spring中的几个接口来指定,主要有以下几种:
1) Before Advice
public interface MethodBeforeAdvice extends BeforeAdvice {
void before(Method m, Object[] args, Object target) throws Throwable;
}

//切面类
public class MyLogger {
	public void log(String msg){
		System.out.println("log:"+msg);
	}
}
//前置通知
	public class BeforeAdvice implements MethodBeforeAdvice {
		//切面类
		private MyLogger logger;

		// 参数1 将来我们需要调用的目标对象中的方法镜像
		// 参数2 将来调用方法的时候所传过来的参数
		// 参数3 目标对象
		//将来在调用目标对象方法之前,会先执行这个before方法
		public void before(Method m, Object[] args, Object target) throws Throwable {

			logger.log(m.getName() + " is invoked..");

			/*
			 * 注意:这里一定不要自己手动的用反射去调用这个目标对象中的方法,
			 * 因为spring 会帮我们去调用的,如果我们这个再去调用这个方法,
			 * 那么这这个方法会被调用俩次.
			 * 
			 * m.invoke(target,args);
			 * 
			 */
		}
		get/set
	}

配置xml文件:

 <!-- 配置切面类 -->
 <bean name="logger" class="com.briup.aop.aspect.MyLogger"></bean>
 
 <!-- 配置advice -->
 <bean name="beforeAdvice" 
 class="com.briup.aop.before.BeforeAdvice">
<!-- 注入切面类对象 -->
<property name="logger" ref="logger"></property>
 </bean>
 <!-- 配置dao层对象 -->
 <bean id="dao" class="com.briup.aop.dao.AccountDaoImpl"/>
<!-- 配置一个测试账户 -->
<bean name="account" class="com.briup.aop.pojo.Account">
<property name="id" value="1"></property>	
<property name="name" value="tom"></property>	
<property name="balance" value="1000"></property>	
</bean>
 <!-- 配置目标对象 -->
 <bean name="target" 
 class="com.briup.aop.service.AccountServiceImpl">
<property name="accountDao" ref="dao"></property>
<property name="account" ref="account"></property>
 </bean>
 <!-- 配置代理对象 -->
 <!-- 这里使用的是spring的一个代理对象工厂类产生的 -->
 <bean name="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 注入目标对象 -->
<property name="target" ref="target"></property>
<!-- 注入目标对象所实现的接口 可以有多个接口 -->
<property name="proxyInterfaces">
<list>
<value>com.briup.aop.service.IAccountService</value>
</list>
</property>
<!-- 注入advice  可以有多个 -->
<property name="interceptorNames">
<list>
	<value>beforeAdvice</value>
</list>
</property>
 </bean>

其它advice的xml文件配置大同小异,区别在于配置代理对象的时候要注意
四、advisor增强器
作用:筛选目标对象中要代理的方法,之前的advice是把目标对象中的所有方法全部都进行代理
spring中已经给我们提供了实现类RegexpMethodPointcutAdvisor,在xml中直接配使用就可以了。

 <!-- 配置切面类 -->
    <bean name="logger" class="com.briup.aop.aspect.MyLogger"></bean>

<!-- 配置advice -->
<bean name="beforeAdvice" 
class="com.briup.aop.before.BeforeAdvice">
	<!-- 注入切面类对象 -->
	<property name="logger" ref="logger"></property>
</bean>

<!-- 配置advisor 增强器-->
<!-- 作用:筛选要拦截(要代理)的方法 -->
<bean name="advisor" 
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
	<!-- 注入advice-->
	<property name="advice" ref="beforeAdvice"></property>
	<!-- 注入需要被拦截的目标对象中的方法(连接点) -->
	<property name="patterns">
		<list>
			<value>.*bankAction</value>  单个字符出现0到多次
		</list>
	</property>
</bean>

<bean id="dao" 
class="com.briup.aop.dao.AccountDaoImpl"/>
<!-- 配置目标对象 -->
<bean name="target" 
class="com.briup.aop.service.AccountServiceImpl">
	<property name="accountDao" ref="dao"></property>
</bean>

<!-- 配置代理对象 -->
<!-- 这里使用的是spring的一个代理对象工厂类产生的 -->
<bean name="proxy" 
class="org.springframework.aop.framework.ProxyFactoryBean">
	<!-- 注入目标对象 -->
	<property name="target" ref="target"></property>
	
	<!-- 注入目标对象所实现的接口 可以有多个接口 -->
	<property name="proxyInterfaces">
		<list>
			<value>com.briup.aop.service.IAccountService</value>
		</list>
	</property>
	<!-- 注入advice/advisor  可以有多个 -->
	<property name="interceptorNames">
		<list>
			<value>advisor</value>
		</list>
	</property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值