利用JDK中的proxy技术实现AOP功能

本文介绍了一个具体的面向切面编程(AOP)案例,通过创建PersonServiceBean的代理对象,实现在不修改原有业务逻辑的基础上增加新的行为。利用Java反射机制,我们能够对目标对象的方法进行拦截并增强。

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

需求:现有一个业务Bean(PersonServiceBean),我们需要为PersonServiceBean中的业务方法进行拦截,进行切面编程。

PersonService.java

package com.risetek.service;

public interface PersonService {
	public abstract void add();
	public abstract void delete();
}

PersonServiceImpl.java

package com.risetek.service.impl;

import com.risetek.service.PersonService;

public class PersonServiceBean implements PersonService {

	@Override
	public void add(){
		System.out.println("add...");
	}
	
	@Override
	public void delete(){
		System.out.println("delete...");
	}
}

 

利用Proxy类创建目标对象代理:

    PersonServiceBeanProxyFactory.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.risetek.service.PersonService;
import com.risetek.service.impl.PersonServiceBean;

public class PersonServiceBeanProxyFactory implements InvocationHandler{

	//目标对象
	private PersonServiceBean targetObject;
	
	public PersonService getProxyInstence(PersonServiceBean object){
		this.targetObject = object;
		//通过Proxy类的newProxyInstance方法创建目标对象代理
		//三个参数分别为1.目标对象的类加载器。2.目标对象的接口。3.拦截到方法后的回调对象(回调对象必须实现InvocationHandler接口)
		//Proxy.newProxyInstance()方法创建的代理对象实现了目标对象所有的接口,因此可以将代理对象强制转换成目标对象的接口类型
		return (PersonService) Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
	}

	//实现InvocationHandler接口方法,该方法会拦截目标对象的方法,进行回调
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//do something...
		//将方法委派给目标对象执行
		method.invoke(this.targetObject, args);
		//do something...
		return null;
	}
}

  

这样我们在客户端就可以使用工厂方法创建代理对象了。

public class TestDemo {

	@Test
	public void testProxy() {
		PersonService personService = new PersonServiceBeanProxyFactory().getProxyInstence(new PersonServiceBean());
		personService.add();
	}
}

 

由于Proxy对象的创建代理方法中要使用到目标对象的接口,因此需要进行拦截的业务Bean必须实现接口,如果业务bean没有实现任何接口,则不能用该方法创建代理对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值