首页 > 代码库 > 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)