关闭

spring动态代理

标签: springobjectexceptionsessionclassnull
207人阅读 评论(0) 收藏 举报
分类:

package com.spring;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.hibernate.Session;
import org.hibernate.Transaction;

import cpm.util.HibernateSessionFactory;


public class SecurityHandler implements InvocationHandler {

//动态代理   实现InvocationHandler接口
private Object targetObject;   //对传进来的目标对象进行代理

//newProxy生成动态代理对象   需要传进来目标对象
public Object newProxy(Object targetObject){
  this.targetObject = targetObject;   //传需要代理的目标对象
  //返回代理对象   this表示本对象实现该代理
  return Proxy.newProxyInstance(
    targetObject.getClass().getClassLoader(),
    targetObject.getClass().getInterfaces(),
    this);
}

//new该类的实例则默认自动调用invoke()方法
//proxy:代理对象  method:对象的方法  Object[] args:对象的参数
public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  // 安全性检查  事务处理
  checkSecurity();
  Session session = HibernateSessionFactory.getSession();
  Transaction tr = session.beginTransaction();
 
  //返回值  若不返回 则客户端拿不到返回值
  Object result = null;
  try{
   //method表示方法如addUser()  result为返回类型void为null
   result = method.invoke(this.targetObject, args);
   tr.commit();
  }catch(Exception e){
   tr.rollback();
   e.printStackTrace();
   throw new java.lang.RuntimeException(e);
  }
  return result;
}

//安全性检查
private void checkSecurity(){
  System.out.println("------checkSecurity()-------");
}

}

//client

public class Client {

public static void main(String[] args) {
  SecurityHandler handle = new SecurityHandler();
  UserManager userManager = (UserManager)handle.newProxy(new UserManagerImpl());
  userManager.addUser("谢孝章", "123456");
}
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59926次
    • 积分:1210
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:7篇
    • 译文:0篇
    • 评论:24条
    最新评论