现在的位置: 首页 > 综合 > 正文

jdk动态代理,spring核心动态代理

2013年03月09日 ⁄ 综合 ⁄ 共 2429字 ⁄ 字号 评论关闭

 首先要有一个借口,一个实现类,

此例子,是为了更加形象化的理解spring动态代理,而且,把相同的check,相同的功能,大众需要的功能模块化,横切到其他处理类当中.

=====================接口===========

package manager;

public interface UserManager {

  public void addUser(String userName,String password);
  
  public void deleteUserById(int id);
  
  public String findUserById(int id);
  
  public void modifyUser(int id,String userName,String password);
}
==================实现=====================

package managerImpl;

import manager.UserManager;

public class UserManagerImpl implements UserManager {

 public void addUser(String userName, String password) {
  System.out.println("===UserManagerImpl==addUser==");
 }

 public void deleteUserById(int id) {
  System.out.println("===UserManagerImpl==deleteUserById==");
 }

 public String findUserById(int id) {
  System.out.println("===UserManagerImpl==findUserById==");
  return null;
 }

 public void modifyUser(int id, String userName, String password) {
  System.out.println("===UserManagerImpl==modifyUser==");
 }

}
=========动态代理类====这就是切面,可以模块儿化的共同需要的方法,以减耦合的方式,切入到所需要的程序中=============

package proxy;

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

public class SecurityHandler implements InvocationHandler {
 
 private Object targetObject;//目标对象,也就是传入的代理类
 
 public Object newProxy(Object targetObject){
  this.targetObject = targetObject;
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
         targetObject.getClass().getInterfaces(),
         this);//this是此方法要传递一个实现了invocationHandler的类,本类就实现了.所以传this就可以
 }
 //横切类
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  SecurityCheck();//织入的,横切的类
  Object ref = null;//声明此变量,是为了目标对象的类的返回值.因为不知道目标对象到底有无返回值.
  
   try {
   ref = method.invoke(this.targetObject, args);//调用真实实现,第一个参数为目标对象,第二个为目标对象的方法
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   throw new java.lang.RuntimeException(e);
  }
  
   return null;
 }
 //此方法在AOP中叫advice,也就是说advice是切面中的处理类
 public void SecurityCheck(){
  System.out.println("=======CheckUser====");
 }

}
================测试类=======================

package test;

import manager.UserManager;
import managerImpl.UserManagerImpl;
import proxy.SecurityHandler;

public class testUserManager {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
   SecurityHandler securityHandler = new SecurityHandler();
  //传入目标对象new UserManagerImpl(),就返回一个代理对象
  UserManager userManager =(UserManager)securityHandler.newProxy(new UserManagerImpl());
  userManager.addUser("", "");
 }

}

抱歉!评论已关闭.