首页 > 其他 > 详细

AOP基础知识及AOP切面编程之注释方法、xml配置方法

时间:2014-08-17 11:50:32      阅读:421      评论:0      收藏:0      [点我收藏+]

<span style="font-family: 微软雅黑; font-size: 10.5pt; letter-spacing: 0pt; ">AOP概念</span>

Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象

joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,这些点是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器.

pointcut(切入点):就是要对哪些点进行拦截的定义。

advice(通知):拦截到的joinpoint之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。通知就是要做的事情。

target(目标对象):代理的目标对象

weave(织入):指将aspect应用到target对象并导致proxy对象创建的过程称为织入。

Introduction(引入);在不修改类代码的前提下,Introduction可以在运行期动态地添加一些方法或者field.

AOP使用到的jar包

spring.jar

commons-logging.jar

aspectjweaver.jar

aspectjrt.jar

cglib-nodep-2.1.3.jar

如果使用了SR250中的注解,如@Resource/@PostConstruct/@PreDestroy的还要引入common-annotation.jar


AOP命名空间的配置

使用spring框架aop要引入下面的aop命名空间(红色部分)

<?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-2.5.xsd

           http://www.springframework.org/schema/aop

           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<aop:aspectj-autoproxy/>

</beans>


下面是使用注释法的aop切面编程的示例的主要代码

package com.gdhdcy.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyInterceptor {
	
	@Pointcut("execution (* com.gdhdcy.service.impl.PersonServiceBean.*(..))")
	private void anyMethod(){};//生命一个切入点
    
	@Before("anyMethod() && args(name)")   //填写的是切入点的方法名称,记得要加上()
	public void doAccessCheck( String name){
		System.out.println("前置通知"+name);
	}
	
	//@AfterReturning("anyMethod()")
	@AfterReturning(pointcut="anyMethod()",returning="result")  //得到返回值
	public void doAfterReturning(String result){
		System.out.println("后置通知"+result);
	}
	
	@After("anyMethod()")
	public void doAfter(){
		System.out.println("最终通知");
	}
	
	//@AfterThrowing("anyMethod()")
	@AfterThrowing(pointcut="anyMethod()",throwing="e")
	public void doAfterThrowing(Exception e){
		System.out.println("例外通知"+e);
	}
	
	@Around("anyMethod()")
	public Object doAround(ProceedingJoinPoint pjp)throws Throwable{
		System.out.println("环绕通知进入");
		Object result=pjp.proceed();
		System.out.println("环绕通知退出");
		return result;
		
	}
}

注释方法beans.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:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
		<aop:aspectj-autoproxy/><!-- 基于注解 -->
		<bean id="myInterceptor" class="com.gdhdcy.service.MyInterceptor"/>
		<bean id="personService" class="com.gdhdcy.service.impl.PersonServiceBean"/>
</beans>

附源码链接:

http://pan.baidu.com/s/1jGmQMjG


xml方法aop切面编程的示例的主要代码

package cn.itcast.service;

import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 切面
 *
 */
public class MyInterceptor {	
	public void doAccessCheck() {
		System.out.println("前置通知");
	}

	public void doAfterReturning() {
		System.out.println("后置通知");
	}
	
	public void doAfter() {
		System.out.println("最终通知");
	}
	
	public void doAfterThrowing() {
		System.out.println("例外通知");
	}
	
	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("进入方法");
		Object result = pjp.proceed();
		System.out.println("退出方法");
		return result;
	}
	
}

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:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <aop:aspectj-autoproxy/> 
        <bean id="personService" class="com.gdhdcy.service.impl.PersonServiceBean"></bean>
        <bean id="aspetbean" class="com.gdhdcy.service.MyInterceptor"/>
        <aop:config>
        	<aop:aspect id="asp" ref="aspetbean">
        		<aop:pointcut id="mycut" expression="execution(* com.gdhdcy.service..*.*(..))"/>
        		<aop:before pointcut-ref="mycut" method="doAccessCheck"/>
        		<aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
			  	<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
			  	<aop:after pointcut-ref="mycut" method="doAfter"/>
			  	<aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
        	</aop:aspect>
        </aop:config>
</beans>


AOP基础知识及AOP切面编程之注释方法、xml配置方法,布布扣,bubuko.com

AOP基础知识及AOP切面编程之注释方法、xml配置方法

原文:http://blog.csdn.net/wanghaiping1993/article/details/38636939

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!