首页 > 代码库 > Spring AOP使用

Spring AOP使用

Spring中AOP的功能非常强大,最常用的就是我们在做框架整合的时候中使用他的切面技术做事务管理,或者系统的日志记录。

开发步骤:

1.在spring配置文件头部加入命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
然后再加入次配置(proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代
<aop:aspectj-autoproxy proxy-target-class="true"/>

2.实体类:方式一(不太灵活,入门级)

@Aspect //注解这是一个切面
@Component
public class LogAction {
	//这个配置过aop事物管理的都应该知道
	@Pointcut("execution(* com.lwp.service.*.*(..))")
    public void inServiceLayer() {
		//这个方法并不会执行,上面的注解用于站位
	}
	long start,end;
	@Before("inServiceLayer()")
	public void before(){
		System.out.println("===== 方法之前执行 ======");
		start = System.currentTimeMillis();
	}
	
	@After("inServiceLayer()")
	public void after(){
		end = System.currentTimeMillis();
		//无论service层中的代码有无异常,都会执行这里
		System.out.println("===== 方法之后执行 ======"+(end - start));
	}
}
实体类:方式二(推荐)

/**
 * AOP注解方法实现日志管理 利用spring AOP 切面技术记录日志 定义切面类(这个是切面类和切入点整天合在一起的),这种情况是共享切入点情况;
 * 
 */
@Aspect//该注解标示该类为切面类
@Component
public class LogAopAction {
	

	@Around("execution(* com.lwp.service.*.* (..))")
	public Object logAll(ProceedingJoinPoint point) throws Throwable {
		Object result = null;
		// 执行方法名 和 类名
		String methodName = point.getSignature().getName();
		String className = point.getTarget().getClass().getSimpleName();
		System.out.println(className+" "+ methodName);
		String user = null;
		Long start = 0L;
		Long end = 0L;
		try {
			// 执行方法所消耗的时间
			start = System.currentTimeMillis();
			// 获取执行方法的参数,这里可以进行参数的修改
			Object[] args = point.getArgs();
			result = point.proceed(args);
			//执行到这里证明service业务层操作成功,可以做成功的日志处理
			end = System.currentTimeMillis();
			for(Object obj :args){
				if(obj instanceof User){
					//用户登录成功记录登录日志
				}
				//....
			}
			System.out.println(className +" "+methodName +" "+ (end-start));
		
		} catch (Throwable e) {
			 //这里service产生错误
			 //抛出异常,到controller层处理
			 throw e; 
		}
		
		return result;
	}
}

推荐使用第二种方法,灵活多变,功能强大。


Spring AOP使用