Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205183
  • 博文数量: 66
  • 博客积分: 966
  • 博客等级: 准尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-11 11:52
文章分类

全部博文(66)

文章存档

2012年(60)

2011年(6)

分类: Java

2012-10-15 10:17:13

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;
 }
 
 
 
 
 
}
阅读(2036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~