Spring AOP(面向切面)
2017-12-14 11:52
387 查看
Spring普通配置增强处理:
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>
相关文章推荐
- 【Spring】AOP - 面向切面
- Spring核心机制(面向切面编程AOP)
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)
- Spring、Mybatis和Logback集成,用面向切面AOP方式捕获并打印异常Exception信息
- Spring AOP的基本原理及面向切面编程的实现
- spring 第10 天 AOP 面向切面
- Spring面向切面编程AOP讲解
- spring 面向切面编程AOP的原理
- Spring代码实例系列-07:Spring AOP面向切面,模拟实现事物控制
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
- 面向切面(AOP)之Spring接口方式 schema配置方式 aspectj注解方式
- 【Spring】AOP - 面向切面
- Spring面向切面编程AOP
- Spring核心机制(面向切面编程AOP)详解
- Spring--AOP--面向切面编程
- SpringAOP面向切面详解(带实例)
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- spring的AOP--面向切面编程
- Spring学习,依赖注入(DI)、控制反转(IoC)和面向切面(AOP)
- Spring面向切面编程AOP(around)