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

本文介绍了如何在Spring框架中使用JDK动态代理实现AOP(面向切面编程)。通过创建一个MyAspect类,包含不同类型的增强方法(前置、后置、最终、环绕、异常),然后利用XML配置文件定义切入点表达式并关联切面。测试类展示了AOP的完整流程,动态代理类JdkProxy实现了InvocationHandler接口,并通过Proxy类创建代理对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增强类· 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);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值