package cn.hinge.service.Impl;
import cn.hinge.service.PersonService;
/**
* 目的对该业务 bean 所有方法进行拦截
* 通过用户 user 是否 存在(或者为空) 判断是否有调用以下方法的权限
* 可以通过代理对象来做拦截;这点很重要,
* 为什么要对业务bean所以方法进行拦截呢?主要是想将业务bean中如日志打印,权限控制,(以后会遇到的事务管理)等等这些与业务执行方法无关的东西抽取出来。说白了这就是切面
* 编程,也是说他们呢之前没有什么关联,但是又必须要有,所以可以用代理对象 做 目标对象不想做的一些东西。从而达到高度解耦的目的
*
* @author yangrenjun
*
PersonService 此类省略
以下是实现及实现的方法体
*/
1.创建接口类PersonService ,以及对它的实现如下
public class PersonServiceBean implements PersonService{
private String user = null;
public PersonServiceBean(){};
public PersonServiceBean(String user){
this.user = user;
};
public String getPersonName(Integer personid) {
System.out.println("我是getPersonName()方法");
return "xxxx";
}
public void save(String name) {
System.out.println("我是save()方法");
}
public void update(String name, String id) {
System.out.println("我是update()方法");
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
/*
一下通过2种方式,实现对业务方法的拦截,
第一种:为目标对象动态创建代理对象 Porxy
通过JDK动态反射机制拦截 通过代理模式实现方法拦截, 通过代理模式创建代理对象实现目标对象所有方法拦截接;
理解过程: 客户端 代理对象 目标对象
客户端在调用目标对象(PersonServiceBean )之前,先经过代理对象,也就是客户端调用的是代理对象,因为代理对象是实现了目标对象的所有接口,所以代理对象对方法的调用可以将方法委派给目标对象,
第二种:通过第三方框架:cig-lib 进行方法拦截
*/
第一种:
package cn.hinge.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.hinge.service.Impl.PersonServiceBean;
/**
* 创建代理:主要为了创建代理类
* 为目标对象动态创建代理对象 Porxy ,前提条件是目标对象必须实现接口
* @author Administrator
*/
public class JDKProxyFactory implements InvocationHandler{
// 参数:目标对象 说白了就是要来接的业务对象 这里是PersonServiceBean
private Object targetObject;
public Object createProxyInstance (Object targetObject){
this.targetObject = targetObject;
//为目标对象创建代理类,前提条件是目标对象必须实现接口
//这里主要将this 去执行 invoke 方法
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), //目标对象装载器
this.targetObject.getClass().getInterfaces(), //意思就是代理对象能实现目标对象的所有接口
this);//执行回调函数 this 代表 JDKProxyFactory 条件是此类(this)必须实现
//InvocationHandler接口 并实现 回调 invoke 方法 ,
// 重点理解:当我们对代理对象业务方法(this.targetObject.getClass().getClassLoader(),
//this.targetObject.getClass().getInterfaces()),)进行调用的时候,会被这里this拦截到,拦截以后会执行inoke方法
}
// 此方法属于 InvocationHandler 接口 参数数分别表示 代理对象,被拦截的方法 ,方法输入参数
// 当客户端调用创建代理对象方法的时候,代理对象就会调用invoke方法,在这个方法里面将方法委派给目标对象,实现了对方法的拦截
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean =(PersonServiceBean)this.targetObject;
Object result =null;
if(bean.getUser()!=null){//表示有权限,那么可以执行目标的方法
//必须将代理对象的拦截方法委派给目标对象
result = method.invoke(targetObject, args);
}//否则没有权限调用
return result;
}
}
第二种方式:通过第三方插件实现:
/**
* 创建代理:主要为了创建代理类
* 为目标对象动态创建代理对象 Porxy ,前提条件是目标对象必须实现接口
* @author Administrator
*/
public class JDKProxyFactory implements InvocationHandler{
// 参数:目标对象 说白了就是要来接的业务对象 这里是PersonServiceBean
private Object targetObject;
public Object createProxyInstance (Object targetObject){
this.targetObject = targetObject;
//为目标对象创建代理类,前提条件是目标对象必须实现接口
//这里主要将this 去执行 invoke 方法
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), //目标对象装载器
this.targetObject.getClass().getInterfaces(), //意思就是代理对象能实现目标对象的所有接口
this);//执行回调函数 this 代表 JDKProxyFactory 条件是此类(this)必须实现
//InvocationHandler接口 并实现 回调 invoke 方法 ,
// 重点理解:当我们对代理对象业务方法(this.targetObject.getClass().getClassLoader(),
//this.targetObject.getClass().getInterfaces()),)进行调用的时候,会被这里this拦截到,拦截以后会执行invoke方法
}
// 此方法属于 InvocationHandler 接口 参数数分别表示 代理对象,被拦截的方法 ,方法输入参数
// 当客户端调用创建代理对象方法的时候,代理对象就会调用invoke方法,在这个方法里面将方法委派给目标对象,实现了对方法的拦截
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean =(PersonServiceBean)this.targetObject;
Object result =null;
if(bean.getUser()!=null){//表示有权限,那么可以执行目标的方法
//必须将代理对象的拦截方法委派给目标对象
result = method.invoke(targetObject, args);
}//否则没有权限调用
return result;
}
}
阅读(2025) | 评论(0) | 转发(0) |