欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring AOP入门教程 博客分类: Spring Spring AOPAOPAspect 

程序员文章站 2024-03-22 09:15:10
...

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环绕通知时,必须有返回值。