天天看点

Spring的JDK动态代理+基于xml的声明式AspectJ

增强类· MyAspect

package com.on.aspect;

public class MyAspect {

//前置增强

public void before(){

System.out.println(“前置增强”);

}

//最终增强

public void after(){

System.out.println(“最终增强”);

}

//后置增强

public void afterReturn(){

System.out.println(“后置增强”);

}

//环绕增强

public void round(){

System.out.println(“环绕增强”);

}

//异常增强

public void exrction(){

System.out.println(“异常增强”);

}

}

DAO接口

package com.on.dao;

public interface Opreate {

void add(int num1,int num2);

void del(int num1,int num2);

void cheng(int num1,int num2);

void chu(int num1,int num2);
           

}

OpreateImpl 继承Opreate接口 重写方法

package com.on.dao.impl;

import com.on.dao.Opreate;

public class OpreateImpl implements Opreate{

@Override
public void add(int num1, int num2) {
	System.out.println(num1+num2);
	
}

@Override
public void del(int num1, int num2) {
	System.out.println(num1-num2);
	
}

@Override
public void cheng(int num1, int num2) {
	System.out.println(num1*num2);
	
}

@Override
public void chu(int num1, int num2) {
	System.out.println(num1/num2);
	
}
           

}

JDK代理类

package com.on.jdk;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import com.on.aspect.MyAspect;

import com.on.dao.Opreate;

public class JdkProxy implements InvocationHandler{

private Opreate opreate;
/***
 * 返回代理对象
 * @param userDao
 * @return
 */
public Object createProxy(Opreate opreate){
	
	this.opreate=opreate;
	//获取当前类的类加载器
	ClassLoader classLoader=JdkProxy.class.getClassLoader();
	//获取被代理对象所实现的接口
	Class[] clazz=opreate.getClass().getInterfaces();
	//利用Proxy创建目标对象的动态代理
	return Proxy.newProxyInstance(classLoader,clazz,this);
}


@Override
public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {
	//创建切面对象
	MyAspect myAspect=new MyAspect();
	
	myAspect.before();
	
	Object obj=method.invoke(opreate, args);
	
	myAspect.afterReturn();
	
	return obj;


}
           

}

配置 applicationContext.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

aop:config

<aop:pointcut expression=“execution(* com.on.dao.impl..(…))” id=“pointcut”/>

<aop:aspect ref=“myAspect”>

<aop:before method=“before” pointcut-ref=“pointcut”/>

<aop:after-returning method=“afterReturn” pointcut-ref=“pointcut”/>

</aop:aspect>
	</aop:config>    
           

测试类

package com.on.test;

import static org.junit.Assert.*;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.on.dao.Opreate;

import com.on.dao.impl.OpreateImpl;

import com.on.jdk.JdkProxy;

public class Test {

@org.junit.Test
public void test() {
	String path="applicationContext.xml";
	ApplicationContext applicationContext=new ClassPathXmlApplicationContext(path);
	Opreate op=(Opreate)applicationContext.getBean("op");
	op.add(1,2);
}
@org.junit.Test
public void test1() {
	Opreate opreate=new OpreateImpl();
	JdkProxy jdk=new JdkProxy();
	//返回一个代理对象
	Opreate proxyOp=(Opreate) jdk.createProxy(opreate);
	proxyOp.add(1,2);
	proxyOp.cheng(1,2);
}
           

}