1、业务接口
package com.sgl.service;
public interface PersonService {
void save();
void update(Integer personID, String name);
}
2业务接口层实现
package com.sgl.service.imp;
import com.sgl.service.*;
public class PersonServiceBean implements PersonService {//业务bean
private String user = null;
public PersonServiceBean() {
}
public PersonServiceBean(String user) {
this.user = user;
}
public String getUser() {
return user;
}
public void update(Integer personID, String name) {
System.out.println("已经更新了");
}
public void save() {
System.out.println("我是Save()方法");
}
}
3、代理工厂
package com.sgl.aop;
import com.sgl.service.imp.PersonServiceBean;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyFactory implements InvocationHandler {
private Object targetObject;//被代理类的原始实例
public JDKProxyFactory(Object targetObject) {
this.targetObject = targetObject;
}
public JDKProxyFactory() {
}
/**
* 由被代理类的实例targetObject来创建代理对象,代理对象实质是被代理类的实例
* @param targetObject
* @return
*/
public Object createProxyInstance(Object targetObject) {
/**
* newProxyInstance()方法
* 第一个参数是被代理类的加载器
* 第二个参数是被代理类接口所实现的所有方法
* 第三个参数表示由哪个代理类处理
*/
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
/**
* 访方法被自动调用,invoke的所有参数在代理对象调用业务方法时,自动赋值
* @param proxy 代理对象
* @param method 被代理的方法
* @param args 被代理方法的参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
PersonServiceBean personBean = (PersonServiceBean) this.targetObject;
if (personBean.getUser() != null) {//如果有权限
result = method.invoke(this.targetObject, args);//代理类将方法调用委派给目标对象来调用
}
return result;
}
}
4、JUnit测试类(JUnit 4.x)
package junit.test;
import com.sgl.aop.JDKProxyFactory;
import com.sgl.service.PersonService;
import com.sgl.service.imp.PersonServiceBean;
import org.junit.Test;
public class PersonProxyTest {
@Test
public void proxyTest() {
PersonServiceBean personBean = new PersonServiceBean("史贵岭");
JDKProxyFactory jDKProxyFactoryObject = new JDKProxyFactory(personBean);
PersonService proxy = (PersonService) jDKProxyFactoryObject.createProxyInstance(personBean);
proxy.save();
}
}