【Spring学习笔记】Spring Aop细说

AOP(Aspect Oriented Programming)面向切面编程

概述

AOP(Aspect Oriented Programming)面向切面编程是Spring为了降低代码耦合度而设计的一种方式。我们在实际应用中主要是为了打印日志、业务拦截器、统计业务数据等。

细说Spring Aop

Aop中有很多的专有名词,切面(Aspect),通知(Advice),连接点(Join Point),切点(Point Cut),引入(Introduction),织如(Weaving)。其实我们在开发中主要写的就是通知,因为切面和连接点以及切点都已经在项目刚刚开始的时候就已经定义够了,除非大的改动平时是不会变的了。下面给一个小demo就知道咋回事了。

第一步,定义切面

package com.example.readingli.aop;

import org.aspectj.lang.ProceedingJoinPoint;
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.Pointcut;
import org.springframework.context.annotation.Configuration;
/**
 * Spring-aop配置
 * @author liugd
 *
 */
@Aspect//增加该注解表明为一个切面
@Configuration
public class AopTest {

} 

第二步定义切点

package com.example.readingli.aop;

import org.aspectj.lang.ProceedingJoinPoint;
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.Pointcut;
import org.springframework.context.annotation.Configuration;
/**
 * Spring-aop配置
 * @author liugd
 *
 */
@Aspect
@Configuration
public class AopTest {
	/**
	 * 切点
	 */
	@Pointcut("execution(* com.example.readingli.web.*.*(..))")//拦截com.example.readingli.web路径下所有类的所有方法,任意参数和返回值
	public void pointCut(){
		
	}
}

@Pointcut表明这个方法是一个切点(相当于对所有需要拦截的方法的一个适配方法,只要在通知(advice)上配置该切点就可以拦截所有的连接点(被拦截的方法))

第三步编写通知(通知可以直接是编写在切面中的方法,也可以是Spring容器中的一个bean)。

package com.example.readingli.aop;
import org.aspectj.lang.ProceedingJoinPoint;
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;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * Spring-aop配置
 * @author liugd
 *
 */
@Aspect
@Configuration
public class AopTest {
	/**
	 * 切点
	 */
	@Pointcut("execution(* com.example.readingli.web.*.*(..))")
	public void pointCut(){
		
	}
	
	/**
	 * 异常后通知
	 */
	@AfterThrowing("pointCut()")
	public void AfterThrowing(){
		
		
	}
	/**
	 *后置通知
	 */
	@AfterReturning("pointCut()")
	public void After(){
		
	}
	
	@Before("pointCut()")
	public void Before(){
		
	}
	
	/**
	 * 环绕通知
	 * @param jp
	 */
	@Around("pointCut()")
	public Object around(ProceedingJoinPoint jp){
		Object result = null;
		try {
			System.out.println("方法开始前。。。");
			result = jp.proceed();
			System.out.println(result.toString());
			System.out.println("方法开始后。。。");
		} catch (Throwable e) {
			System.out.println("异常: "+e.getMessage());
			e.printStackTrace();
		}
		return result;		
	}
}
注:如果通知中使用的类不在容器中(不能在该类上增加注解@Component),那么java配置的方式就不能用了,必须使用xml配置。






你可能感兴趣的:(Spring基础)