springAOP基礎(一)-java-動態代理

一.什麼是AOP

面向切面編程,簡單描述就是在一個方法前後增加任何想做的事情,比如添加日誌信息,統一異常處理,統一請求信息打印,統一分頁處理等等;

二.靜態代理

寫個簡單的代理模式,更有助於理解

用戶添加功能,impl實現類

package com.huajie.aop.day1.service.imp;

import com.huajie.aop.day1.service.UserService;

public class UserServiceImpl implements UserService{

	@Override
	public void add() {
		System.out.println("添加數據");
	}

}

接口

package com.huajie.aop.day1.service;

public interface UserService {
	void add();
}

正常情況,new  UserServiceImpl 對象 調用add方法

代理模式會寫一個接口的代理類,在 用戶 add方法前後 可以加上自己的代碼處理

package com.huajie.aop.day1.aspect;

import com.huajie.aop.day1.service.UserService;

public class UserServiceProxy {
	private UserService userService;

	public UserServiceProxy(UserService userService) {
		this.userService = userService;
	}
	
	public void add(){
		System.out.println("事物開啓");
		userService.add();
		System.out.println("事物結束");
	}
	

}

測試類如下

package com.huajie.aop.day1.aspect;

import com.huajie.aop.day1.service.UserService;
import com.huajie.aop.day1.service.imp.UserServiceImpl;

/**
 * @author Administrator
 * 靜態代理測試
 */
public class test001 {
	public static void main(String[] args) {
		UserService userService = new UserServiceImpl();
		UserServiceProxy userServiceProxy = new UserServiceProxy(userService);
		userServiceProxy.add();
	}

}

測試效果

三,java動態代理

java中動態代理是通過反射技術,類實現InvocationHandler接口 來實現動態代理的

關鍵實現代碼如下

獲取代理對象

public static <T> T getObjectProxy(T objSrevice) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		InvocationHandlerImpl2 invocationHandlerImpl = new InvocationHandlerImpl2(objSrevice);
		ClassLoader loader = objSrevice.getClass().getClassLoader();
		Class<?>[] interfaces = objSrevice.getClass().getInterfaces();
		T newProxyInstance = (T) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
		return newProxyInstance;
	}

反射執行類的方法,並在方法執行的前後 添加自己的代碼程序

@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object reuslt = null;
		System.out.println("----動態代理之前------");
		reuslt = method.invoke(target, args);
		System.out.println("----動態代理之後------");
		return reuslt;
	}

完成代碼如下

package com.huajie.aop.day1.aspect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.huajie.aop.day1.service.UserService;
import com.huajie.aop.day1.service.imp.UserServiceImpl;


public class InvocationHandlerImpl2 implements InvocationHandler {
	private Object target;

	public InvocationHandlerImpl2(Object target) {
		this.target = target;
	}

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		UserService userSrevice1 = new UserServiceImpl();
		UserService userProxy  = getObjectProxy(userSrevice1);
		userProxy.add();
	}

	public static <T> T getObjectProxy(T objSrevice) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		InvocationHandlerImpl2 invocationHandlerImpl = new InvocationHandlerImpl2(objSrevice);
		ClassLoader loader = objSrevice.getClass().getClassLoader();
		Class<?>[] interfaces = objSrevice.getClass().getInterfaces();
		T newProxyInstance = (T) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
		return newProxyInstance;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object reuslt = null;
		System.out.println("----動態代理之前------");
		reuslt = method.invoke(target, args);
		System.out.println("----動態代理之後------");
		return reuslt;
	}

}

測試效果:

java動態代理有助於理解springAOP,spring中使用的是cglib技術實現,效率更快,但思想上相同。

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