您的位置:首页 > 编程语言 > Java开发

Spring AOP(面向切面)

2017-12-14 11:52 387 查看
Spring普通配置增强处理:

package cn.lilin.utils;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

/**
* 添加日志的aop
*
* @author 30869
*
*/
@Service("addLogger")
public class AddLogger {
private static final Logger log = Logger.getLogger(AddLogger.class);
/**
* 前置增强
* @param jp
*/
public void before(JoinPoint jp) {
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
/**
* 后置增强
* @param jp
* @param result
*/
public void afterReturning(JoinPoint jp,Object result) {
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法返回值:" + result);
}

/**
* 异常抛出增强
* @param jp
* @param e
*/
public void afterThrowring(JoinPoint jp,Exception e){
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "产生异常"+e);
}

/**
* 最终增强
* @param jp
* @param e
*/
public void after(JoinPoint jp,Exception e){
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "执行完毕");
}

/**
* 环绕增强
* @param jp
* @return
* @throws Throwable
*/
public Object aroundLogger(ProceedingJoinPoint jp)throws Throwable{
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法入参:" + Arrays.toString(jp.getArgs()));
try{
Object result=jp.proceed();//执行目标方法并获得其返回值,此处可以对返回值进行修改
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法返回值:" + result);
return result;
}catch(Throwable e){
log.error(jp.getSignature().getName()
+ "方法发生异常"+e);
throw e;
}finally{
log.info(jp.getSignature().getName()
+ "执行完毕");
}
}
}
<?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-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

<bean id="addLogger" class="cn.lilin.utils.AddLogger"></bean>

<aop:config>
<!-- 定义一个切入点表达式,命名为pointcut -->
<aop:pointcut id="pointcut"
expression="execution(public Integer saveUser(cn.lilin.entity.User))" />
<!-- execution表示切入点指示符,括号中是一个切入点表达式,支持模糊匹配 public * saveUser(entity.User)
表示匹配所有类型的返回值 public void *(entity.User) 表示匹配所有方法名 public void saveUser(..)
表示匹配所有参数个数和类型 * cn.liin.service.*.*(..) 表示cn.liin.service包下所有类的所有方法 * cn.liin.service..*.*(..)
表示cn.liin.service包下及其子包下所有类的所有方法 -->

<!-- 引用包含增强方法的Bean -->
<aop:aspect ref="addLogger">

<!-- 将before()定义为前置增强并引用pointcut切入点 -->
<!-- 			<aop:before method="before" pointcut-ref="pointcut"></aop:before>

将afterReturning()定义为后置增强并引用pointcut切入点
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"></aop:after-returning>

异常抛出增强
<aop:after-throwing method="afterThrowing"
pointcut-ref="pointcut" throwing="e"></aop:after-throwing>

最终增强
<aop:after method="after" pointcut-ref="pointcut"/>
-->
<!-- 环绕增强 :目标方法前后都可以织入,可以获取或修改目标方法的参数、返回值、对他进行异常处理以及决定目标方法是否执行-->
<aop:around method="aroundLogger" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>


Spring使用注解配置增强处理:

package cn.lilin.utils;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
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;
import org.springframework.stereotype.Service;

/**
* 添加日志的aop
*
* @author 30869
*
*/
@Service("addLogger")
@Aspect//使用注解定义切面
public class AddLogger {
private static final Logger log = Logger.getLogger(AddLogger.class);
@Pointcut("execution(* cn.lilin.service.user.impl.*.*(..))")//统一定义切入点要求
public void pointcut(){}
/**
* 前置增强
* @param jp
*/
@Before("pointcut()")
public void before(JoinPoint jp) {
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
/**
* 后置增强
* @param jp
* @param result
*/
@AfterReturning(pointcut="pointcut()",returning="result")
public void afterReturning(JoinPoint jp,Object result) {
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法返回值:" + result);
}

/**
* 异常抛出增强
* @param jp
* @param e
*/
@AfterThrowing(pointcut="pointcut()",throwing="e")
public void afterThrowring(JoinPoint jp,Exception e){
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "产生异常"+e);
}

/**
* 最终增强
* @param jp
* @param e
*/
@After("execution(* cn.lilin.service.user.impl.*.*(..))")
public void after(JoinPoint jp){
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "执行完毕");
}

/**
* 环绕增强
* @param jp
* @return
* @throws Throwable
*/
@Around("execution(* cn.lilin.service.user.impl.*.*(..))")
public Object aroundLogger(ProceedingJoinPoint jp)throws Throwable{
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法入参:" + Arrays.toString(jp.getArgs()));
try{
Object result=jp.proceed();//执行目标方法并获得其返回值,此处可以对返回值进行修改
log.info("调用" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法返回值:" + result);
return result;
}catch(Throwable e){
log.error(jp.getSignature().getName()
+ "方法发生异常"+e);
throw e;
}finally{
log.info(jp.getSignature().getName()
+ "执行完毕");
}
}
}
<?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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- 扫描包中用注解标注的类 -->
<context:component-scan base-package="cn.lilin.dao.user.impl,cn.lilin.service.user.impl,cn.lilin.utils"></context:component-scan>
<!-- 启用对于@AspectJ注解的支持,Spring将自动为匹配的Bean创建代理 -->
<aop:aspectj-autoproxy/>
</beans>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: