1.aop可以在不更改代码的情况下,在代码执行前后增加方法。可以方便的提高效率。 例如在查看方法性能时、追加日志、增加权限等
测试类
package springdemo.demo4; import org.springframework.stereotype.Component; public class studentDao { public void save(){ System.out.println("保存"); } void update(){ System.out.println("更新"); } public String delete(){ System.out.println("删除"); return "删除了哈。。"; } void search(){ System.out.println("查询"); int i =1/0; } }
aop 代理
package springdemo.demo4; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; /** * 切面类 */ public class MyAspectXml { /** * 前置通知 可以获取切入点信息 * @param joinPoint */ public void chekPri(JoinPoint joinPoint){ System.out.println("权限校验" + joinPoint); } /** * 后置通知 可以获取返回值内容 * @param result */ public void wlog(Object result){ System.out.println("日志记录。。。" + result); } /** * 环绕通知 -性能监控 * @param joinPoint * @return * @throws Throwable */ public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕前通知"); Object object = joinPoint.proceed(); //执行目标程序 System.out.println("环绕后通知"); System.out.println("总共执行了3s"); return object; } /** * 异常抛出 */ public void afterThrow(Throwable ex){ System.out.println("异常抛出.." + ex.getMessage()); } /** * 最终通知,相当于 finally */ public void after(){ System.out.println("最终通知..."); } }
xml配置
<?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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--配置扫描(哪些包下需要使用注解)--> <!-- <context:component-scan base-package="springdemo.demo4"/> --> <bean id="studentDao" class="springdemo.demo4.studentDao"></bean> <!--将切面类交给spring管理--> <bean id="myAspect" class="springdemo.demo4.MyAspectXml"/> <!--通过AOP配置完成对目标产生的代理--> <aop:config> <!--表达式配置哪些类哪些方式需要增强--> <!--配置切点,需要运用切面的方法--> <aop:pointcut id="pointcut1" expression="execution(* springdemo.demo4.studentDao.save(..))"></aop:pointcut> <aop:pointcut id="pointcut2" expression="execution(* springdemo.demo4.studentDao.delete(..))"></aop:pointcut> <aop:pointcut id="pointcut3" expression="execution(* springdemo.demo4.studentDao.update(..))"></aop:pointcut> <aop:pointcut id="pointcut4" expression="execution(* springdemo.demo4.studentDao.search(..))"></aop:pointcut> <!--配置切面--> <aop:aspect ref="myAspect"> <!--前置通知--> <aop:before method="chekPri" pointcut-ref="pointcut1"/> <!--后置通知--> <aop:after-returning method="wlog" pointcut-ref="pointcut2" returning="result"/> <!--环绕通知--> <aop:around method="around" pointcut-ref="pointcut3"/> <!--异常抛出通知--> <aop:after-throwing method="afterThrow" pointcut-ref="pointcut4" throwing="ex"/> <!--最终通知--> <aop:after method="after" pointcut-ref="pointcut4"/> </aop:aspect> </aop:config> </beans>
原文地址:https://www.cnblogs.com/xiaoyii/p/9781318.html
时间: 2024-10-20 16:20:33