首页 > 代码库 > cglib动态代理(即AOP)
cglib动态代理(即AOP)
Computer.java
package com.wh.spring_aop; public class Computer { public void playLOL(){ System.out.println("LOL进行中..."); } public String result(boolean flag){ System.out.println("公布比赛结果..."); if(flag){ return "您赢了"; }else{ int a=10/0; return "您输了"; } } }
AopProxy.java
package com.wh.spring_aop; import org.aspectj.lang.JoinPoint; /** * 完成AOP的步骤 1、切入点程序。 2、切面程序。 3、通过配置文件将切面程序插入到切入点程序的某个位置上(通知) * */ public class AopProxy { public void addBefore(JoinPoint jp){ System.out.println("AOP前置通知!"); } public void addAfterReturn(Object returnResult){ if(returnResult!=null){ System.out.println("AOP后置通知!"+returnResult); } System.out.println("AOP后置通知"); } public void addAfter(){ System.out.println("AOP最终通知"); } public void addThrow(Throwable e){ System.out.println("AOP异常通知 异常信息是: "+e.getMessage()); } }
applicationContext.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:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <bean id="computer" class="com.wh.spring_aop.Computer" /> <bean id="aopProxy" class="com.wh.spring_aop.AopProxy" /> <aop:config> <!-- 虽然返回值类型可以任意 方法名任意 参数类型任意 ,但是参数个数不是任意的,有几个星号就代表有几个参数,参数个数不匹配,则不会执行aop --> <aop:pointcut expression="execution(* com.wh.spring_aop.Computer.*(*))" id="computerCut" /><!--此处为切入点 --> <aop:aspect ref="aopProxy"><!-- 此处为切面 --> <!-- AOP前置通知 --> <aop:before method="addBefore" pointcut-ref="computerCut" /><!-- 此处为通知 --> <!-- AOP后置通知:在目标组件的方法正常执行并返回参数后执行的程序。 切面程序:后置通知的切面程序中可以获取到目标方法返回参数,但需要在配置文件中声明参数名,依赖spring容器注入参数值。 returning="returnResult"里的值要与AopProxy里的方法里的参数名一致,否则报错 --> <aop:after-returning method="addAfterReturn" pointcut-ref="computerCut" returning="returnResult"/> <!-- AOP异常通知:在目标组件的方法抛出异常信息后执行的程序。 切面程序:异常通知的切面程序中可以获取到目标组件抛出的异常信息,需要在配置文件上声明异常参数名,依赖spring容器注入参数值。 --> <aop:after-throwing method="addThrow" pointcut-ref="computerCut" throwing="e"/> <!-- AOP最终通知:在目标组件的方法正常执行后执行,或在异常通知之前执行。 --> <aop:after method="addAfter" pointcut-ref="computerCut"/> </aop:aspect> </aop:config> </beans>
TestMVC.java
package com.wh.spring_aop; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestMVC { @Test public void test01(){ @SuppressWarnings("resource") ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Computer computer =(Computer)ac.getBean("computer"); //computer.playLOL(); computer.result(false); } }
运行结果:
AOP前置通知!
公布比赛结果...
AOP异常通知 异常信息是: / by zero
AOP最终通知
cglib动态代理(即AOP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。