Spring AOP入门教程

1. 什么是Spring AOP?

 Aspect Oriented Programming : 面向方面编程

   OOP:核心是对象,关注点是将需求抽象成对象

   AOP: 核心是方面,关注点是将共通处理提取,动态的作用到某一批对象方法上

 

2. AOP相关概念

 a. 方面(Aspect) 

方面指的是封装共通处理逻辑的组件,可以动态作用到目标组件方法

b. 切入点(Pointcut)

切入点用于指定哪些组件是目标,要追加方面Aspect组件

 

切入点表达式有以下几种

--方法限定方法表达式(哪些方法用方面组件处理)

execution([修饰符] 返回类型 方法名(参数) [throws 异常])

 

execution(* add*(..))  只是限制了方法名必须以add开头

--第一个*表示不限制返回值类型

--add* 表示方法名

--(..) 表示0到多个参数

execution(* com.mscncn.dao.UserDao.insert*(..))

 

execution(* com.mscncn.dao.*.*(..))

--匹配com.mscncn.dao包下所有类的所有方法

execution(* com.mscncn.dao..*.*(..))

--匹配com.mscncn.dao包下,及其子包下得所有类的所有的方法

 

 

 

--类型限定(类型匹配,则类型中所有方法都启用方面组件处理)

within(包名.类型名)

within(com.mscncn.dao..*)

--匹配com.mscncn.dao包下,及其子包下得所有类的所有方法

 

 

--Bean名称限定(利用Bean组件的id或name值限制)

 

bean(idOrName名)

 

bean(costListController) 

--匹配id或者name=costListController

bean(*Controller)

--匹配id或者name以Controller结尾的bean

 

 

c. 通知(Advice)

  通知用于指定方面(Aspect)和目标组件之间的作用时机。

   Spring提供以下几种的通知类型,对应不同作用时机。

   前置通知: 先执行方面,再执行目标方法

   后置通知: 先执行目标方法,不出异常,再执行方面

   异常通知: 限制性目标方法,发生异常再执行方面

   最终通知: 先执行目标方法,有无异常,都要执行方面

   环绕通知: 先执行方法(前半部分),在执行目标方法,最后再执行方法(后半部分)

 

try{

    //前置通知

    //环绕通知前

   目标组件

   //环绕通知后

  //后置通知

}catch(Exception e){

  //异常通知

}finally{

  //最终通知

 

 }

 

4. Spring AOP的使用

   

    --分析需求编写共通处理的方面组件(Aspect)

package com.mscncn.spring.ch03.aspect;

public class LoggerBean {
	public void myBefore(){
		System.out.println("前置通知");
	}
}

 

    --分析需求编写切入点表达式(Pointcut)

需要切入到com.mscncn.spring.ch03包下,以及其子包下得所有类的所有方法

 

    --分析需求选择通知类型(Advice)

前置通知

    --分析完成后,配置AOP

<bean id="loggerBean" class="com.mscncn.spring.ch03.aspect.LoggerBean"></bean>
<bean id="app" class="com.mscncn.spring.ch03.App"></bean>
<aop:config>
	<!-- 将loggerBean指定为aspect组件 -->
	<aop:aspect id="loggerAspect"  ref="loggerBean">
		<!-- 指定通知类型 -->
		<aop:before method="myBefore" 
                     pointcut="within(com.mscncn.spring.ch03.App)"/>
	</aop:aspect>
</aop:config>

 

  测试:

package com.mscncn.spring.ch03;

/**
 * Hello world!
 *
 */
public class App {
	public  void ma() {
		System.out.println("Hello World!");
	}
}

 

package com.mscncn.spring.ch03.aspect;

public class LoggerBean {
	public void myBefore(){
		System.out.println("前置通知");
	}
}

 

	@Test
	public void test1(){
		ac.getBean("app",App.class).ma();
	}

 

  注意:当springMVC 使用springAOP那么配置信息必须写在SpringMVC的配置文件中。

  

  Spring AOP环绕通知时,必须有返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值