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技术实现,效率更快,但思想上相同。

猜你喜欢

转载自blog.csdn.net/xiewenfeng520/article/details/81735484