AspectJ

1.1 介绍

AspectJ是一个基于Java语言的AOP框架

Spring2.0以后新增了对AspectJ切点表达式支持

@AspectJ AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面

新版本Spring框架,建议使用AspectJ方式来开发AOP

主要用途:自定义开发

 

1.2 切入点表达式【掌握】

1.execution()  用于描述方法 【掌握】

语法:execution(修饰符  返回值  包..方法名(参数) throws异常)

修饰符,一般省略

public 公共方法

* 任意

返回值,不能省略

void 返回没有值

String 返回值字符串

* 任意

包,[省略]

com.itheima.crm 固定包

com.itheima.crm.*.service crm包下面子包任意 (例如:com.itheima.crm.staff.service

com.itheima.crm.. crm包下面的所有子包(含自己)

com.itheima.crm.*.service.. crm包下面任意子包,固定目录serviceservice目录任意包

类,[省略]

UserServiceImpl   指定类

*Impl             Impl结尾

User*             User开头

*                     任意

方法名,不能省略

addUser                固定方法

add*                     add开头

*Do                      Do结尾

* 任意

(参数)

() 无参

(int)              一个整型

(int ,int)        两个

(..)                  参数任意

throws ,可省略,一般不写。

 

综合1

execution(* com.itheima.crm.*.service..*.*(..))

综合2

2.within:匹配包或子包中的方法(了解)

within(com.itheima.aop..*)

3.this:匹配实现接口的代理对象中的方法(了解)

this(com.itheima.aop.user.UserDAO)

4.target:匹配实现接口的目标对象中的方法(了解)

target(com.itheima.aop.user.UserDAO)

5.args:匹配参数格式符合标准的方法(了解)

args(int,int)

6.bean(id)  对指定的bean所有的方法(了解)

bean('userServiceId')

 

1.3 AspectJ 通知类型

l aop联盟定义通知类型,具有特性接口,必须实现,从而确定方法名称。

l aspectj 通知类型,只定义类型名称。已经方法格式。

个数:6种,知道5种,掌握1中。

before:前置通知(应用:各种校验)

在方法执行前执行,如果通知抛出异常,阻止方法运行

afterReturning:后置通知(应用:常规数据处理)

方法正常返回后执行,如果方法中抛出异常,通知无法执行

必须在方法执行后才执行,所以可以获得方法的返回值。

around:环绕通知(应用:十分强大,可以做任何事情)

方法执行前后分别执行,可以阻止方法的执行

必须手动执行目标方法

afterThrowing:抛出异常通知(应用:包装异常信息)

方法抛出异常后执行,如果方法没有抛出异常,无法执行

after:最终通知(应用:清理现场)

方法执行完毕后执行,无论方法中是否出现异常

环绕

 

try{

     //前置:before

    //手动执行目标方法

    //后置:afterRetruning

} catch(){

    //抛出异常 afterThrowing

} finally{

    //最终 after

}


1.4 导入jar

l 4个:

aop联盟规范

spring aop 实现

aspect 规范

spring aspect 实现

 

1.5 基于xml

1.目标类:接口 + 实现

2.切面类:编写多个通知,采用aspectj 通知名称任意(方法名任意)

3.aop编程,将通知应用到目标类

4.测试

1.5.1 切面类


	
	
	public void myBefore(JoinPoint joinPoint){
		
		System.out.println("前置通知:"+joinPoint.getSignature().getName());
	}
	
	public void myAfterReturning(JoinPoint joinPoint,Object obj){
		  
		System.out.println("后置通知:"+joinPoint.getSignature().getName()+",--->>"+obj);
		
	}
	
	
	public Object myAround(ProceedingJoinPoint  joinPoint) throws Throwable{
		  
		System.out.println("前");
		//手动执行目标方法
		Object obj = joinPoint.proceed();
		
		System.out.println("后");
		return obj;
	}
	
	public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
		System.out.println("抛出异常通知 : " + e.getMessage());
	}
	
	public void myAfter(JoinPoint joinPoint){
		System.out.println("最终通知");
	}

}

1.5.2 ApplicationContext配置




	 
     
     
     
         
     
   
     
         
         
         
         
         
         
         
         
         
         
         
         
         
         
     
   
     
     
         
        
         
         
     
   
     
     
         
         
     
   
     
     
         
     
    
    
    
	
		
		
		
		
	
	
	
	
		
		 
		
	
	
	
	
		
			
      			
			
		
	
	
    
	 
	
	
	
	
	   
	      
	       
		
		
			
			
			
						
			
		    
	   
	
	
	
	


你可能感兴趣的:(Spring)