Spring 實現動態代理 附源碼

spring 實現動態代理幾個步驟:

1、寫一個類 (LoggerProxy)實現invocationHandle 接口中的invoke方法;

2、創建需要代理的對象

3、LoggerProxy 構造方法設置爲私有,創建一個方法來生成對象,這個方法的對象時要代理的對象;

getInstance所返回的對象就是代理對象;

4、設置代理對象以後,不管這個代理對象執行什麼方法,都會調用以下invoke的方法: 配置xml文件; 

到層關鍵代碼:

@Repository("userDao") (??實現IuserDao接口)
public class UserDao implements IUserDao {

    @Override
    public void add(User user) {
     }

    @Override
    public void delete(int id) {
     
    }

    @Override
    public User load(int id) {

    }

}


5.在需要調用的服務類中注入動態代理對象:

@Service("userService")

public class UserService implements IUserService {
    private IUserDao userDao;
    private IUserDao userJDBCDao;

    ---- ---- --- ---

    // 注入IUserDao 接口的動態代理類   

   //?? 可以理解爲IUserDao 接口是用userDynamicDao實現的???

    @Resource(name="userDynamicDao")
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }
    }

}


package org.zttc.itat.spring.log;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
 * 1 寫一個類實現invocation  //
 *
 * */

public class LoggerProxy implements InvocationHandler {
	private LoggerProxy(){
		
	}
	//創建一個代理對象
	private Object target;
	//getinstance 
	public static Object getInstance(Object o){
		//創建logger對象
		LoggerProxy loggerProxy = new LoggerProxy();
		//設置代理對象 //在初始化被注入的時候 target被初始化成o
		loggerProxy.target = o;
		// 通過Proxy的方法創建代理對象,第一個參數是要代理對象的classLoader,第二個參數是
		//要代理對象實現的所有接口,第三個參數是實現類InvocationHandler的對象
		Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(),loggerProxy );
		return result;
	}
	
	//當有了代理對象之後,不管這個代理對象執行什麼方法,都會調用以下的invoke方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//method 就是被代理類裏方法;可以控制那些方法增加操作
		//Object proxy 就是getInstance(Object o)生成的對象、
		//args
		//執行特定方法  //method.getName() 返回方法名
		if(method.getName().equals("add")){
			Logger.info("進行了相應的操作");
		}
		//target 	//創建的對象target;

		Object o  =  method.invoke(target, args);
		return o;
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章