1、创建工程或者java项目
2、定义接口 PersonService, 代码如下:
![]()
package learn.aop.service;
public interface PersonService {
public void save(String personname);
public void update(String personname, Integer personid);
public String getPersonName(Integer personId);
}
3、定义实现类 PersonServiceImpl,代码如下:
![]()
package learn.aop.service.impl;
import learn.aop.service.PersonService;
/**
* 业务需求:对service中的所有方法进行拦截,拦截到方法之后,
* 判读 user 是否为 null;
* 如果为 null 则没有权限去调用service 里面的方法;否则,反之。
*
*/
public class PersonServiceImpl implements PersonService {
private String user;
public String getUser() {
return user;
}
public PersonServiceImpl(){
}
public PersonServiceImpl(String user){
this.user = user;
}
@Override
public void save(String personname) {
System.out.println("save()方法");
}
@Override
public void update(String personname, Integer personid) {
System.out.println("update()方法");
}
@Override
public String getPersonName(Integer personId) {
System.out.println("getPersonName()方法");
return "xuexi";
}
}
4、定义 JDKProxyFactory 类,代码如下:
![]()
package com.learn.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import learn.aop.service.impl.PersonServiceImpl;
public class JDKProxyFactory implements InvocationHandler {
private Object targetObj;
public Object createProxyIntance(Object targetObj){
this.targetObj = targetObj;
// 获得代理类($Proxy0 extends Proxy implements Manager)的实例.
return Proxy.newProxyInstance(this.targetObj.getClass().getClassLoader(), this.targetObj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] arg2)
throws Throwable {
Object result = null;
PersonServiceImpl service = (PersonServiceImpl)this.targetObj;
if(null != service.getUser()){
result = method.invoke(this.targetObj, arg2);
}
return result;
}
}
Proxy 提供用于创建动态代理类和实例的静态方法
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
InvocationHandler 是代理实例的调用处理程序 实现的接口
invoke()
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
5、定义单元测试类,代码如下:
![]()
package junit.test;
import static org.junit.Assert.*;
import learn.aop.service.PersonService;
import learn.aop.service.impl.PersonServiceImpl;
import org.junit.Test;
import com.learn.aop.JDKProxyFactory;
public class ProxyTest {
@Test
public void test() {
// 业务代理类
JDKProxyFactory factory = new JDKProxyFactory();
// 元对象(被代理对象)
PersonService service = (PersonService)factory.createProxyIntance(new PersonServiceImpl("hwl"));
service.save("hwl");
}
}
动态代理还有待补充。
查看:http://www.blogjava.net/aoneany/articles/271019.html