天天看点

JAVA接口代理实现AOP

1.项目结构:

JAVA接口代理实现AOP

2.代码:

1.PersonService.java接口

package com.aop.service;

public interface PersonService {
	
	public void save(String name);
	public void update(String name,Integer personid);
	public String getPersonName(Integer personid);
}
           

2.PersonServiceImpl.java实现类

package com.aop.service.impl;
import com.aop.service.PersonService;
public class PersonServiceImpl implements PersonService{

	private String user =null;
	public PersonServiceImpl() {

	}
	public PersonServiceImpl(String user) {
		this.user = user;
	}
	
	public String getUser() {
		return user;
	}
	@Override
	public void save(String name) {
		System.out.println("我是save");
	}

	@Override
	public void update(String name, Integer personid) {
		System.out.println("update");
	}

	@Override
	public String getPersonName(Integer personid) {
		System.out.println("getPersonName");
		return "qqqqq";
	}

}
           

3.核心代理工厂JDKProxyFactory.java,继承InvocationHandler接口,实现invoke方法

package com.aop.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.aop.service.impl.PersonServiceImpl;

//继承InvocationHandler,实现invoke
public class JDKProxyFactory implements InvocationHandler{
	//对象
	private Object targetObject;
	
	//获取代理对象
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		/*loader:  一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
		interfaces:  一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
		h:  一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上,此调用invoke方法*/
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
	}
	
	/*proxy:  指代我们所代理的那个真实对象
	method:  指代的是我们所要调用真实对象的某个方法的Method对象
	args:  指代的是调用真实对象某个方法时接受的参数*/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//代理内处理真实操作,user==null 返回null不执行方法,否则传递参数调用方法
		PersonServiceImpl impl = (PersonServiceImpl) this.targetObject;
		Object result = null;
		if(impl.getUser() != null)
		{
			result = method.invoke(targetObject, args);
		}
		
		return result;
	}	
}
           

4.测试AOPTest.java

package com.aop.aop;

import static org.junit.Assert.*;

import org.junit.Test;

import com.aop.service.PersonService;
import com.aop.service.impl.PersonServiceImpl;

public class AOPTest {

	@Test
	public void test() {
		JDKProxyFactory jdkpf = new JDKProxyFactory();
		PersonService ps = (PersonService) jdkpf.createProxyInstance(new PersonServiceImpl("11"));
		ps.save("888");
	}

}
           

3.结果

输出:我是save 改

PersonService ps = (PersonService) jdkpf.createProxyInstance(new PersonServiceImpl());
           

无输出。