天天看點

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());
           

無輸出。