1. 程式人生 > >Spring中AOP:Proxy動態代理淺解析(被代理對象必須實現接口)

Spring中AOP:Proxy動態代理淺解析(被代理對象必須實現接口)

ima throwable light public RR eth 對象 處理 span

小貼士:以下內容純屬個人觀點,如有不當請指出並諒解

import java.lang.reflect.Proxy;

Proxy可以動態代理一個對象

寫一個代理工廠類ProxyFactory:

package com.zhangpn.serviceImpl;

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

public class ProxyFactory implements InvocationHandler {
    
private Object target;//這是被動態代理的對象 public Object createProxyIntance(Object target) {//通過調用此方法,將被代理目標傳入並且返回代理對象,在此invoke方法會被回調 this.target = target; return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); } @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("******調用動態被代理對象之前做相關處理******"); method.invoke(target, args); System.out.println("------調用動態被代理對象之後做相關處理------\n"); return null; } }

寫兩個被代理類:

第一個User:

package com.zhangpn.daoImpl;

import com.zhangpn.dao.UserDao;

public class UserDaoImpl implements UserDao {
	
	public void save() {
		System.out.println("UserDaoImpl save success!");
	}

}

其實現的接口:

package com.zhangpn.dao;

public interface UserDao {
	public void save();
}

第二個Student:

package com.zhangpn.daoImpl;

import com.zhangpn.dao.StudentDao;

public class StudentDaoImpl implements StudentDao {
	
	public void save() {
		System.out.println("StrudentDaoImpl save success!");
	}

}

其實現的接口:

package com.zhangpn.dao;

public interface StudentDao {
	public void save();
}

  測試運行:

package com.zhangpn.Test;

import com.zhangpn.dao.StudentDao;
import com.zhangpn.dao.UserDao;
import com.zhangpn.daoImpl.StudentDaoImpl;
import com.zhangpn.daoImpl.UserDaoImpl;
import com.zhangpn.serviceImpl.ProxyFactory;

public class Test {

	public static void main(String[] args) {
		ProxyFactory factory = new ProxyFactory();
		UserDao userDao = (UserDao) factory.createProxyIntance(new UserDaoImpl());
		userDao.save();
		StudentDao studentDao = (StudentDao) factory.createProxyIntance(new StudentDaoImpl());
		studentDao.save();
	}

}

  技術分享圖片


技術分享圖片

Spring中AOP:Proxy動態代理淺解析(被代理對象必須實現接口)