Spring AOP模拟

模拟AOP

AOP(面向切面编程):不修改源代码,添加功能,减少耦合度。

模拟aop实现

1.添加日志功能,(动态代理方式实现)

 关于动态代理的细节
  1.需要一个被代理的对象
  2.类加载器通常时和被代理对象使用相同的类加载器
  3.一般地,Proxy.newProxyInstance()的返回值是一个被代理对象实现的接口的类型。
  也可以是其他的接口类型。
  注意:第二个参数,必须是一个接口类型的数组
  提示:若代理对象不需要额外实现被代理对象实现的接口以外的接口,
 *可以使用target.getClass().getInterfaces()
  4.InvocationHandler通常使匿名内部类的方式:被代理对象需要是一个final类型
5.InvocationHandler的invoke()方法的第一个参数Object proxy指的是
 正在被返回的那个代理对象,一般情况下不适用他。
package com.login.aop;

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

public class LogInterceptor {
	//被代理对象
	private Object target =null;

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}
	public LogInterceptor(){
		
	}
	public void beforeMethod(){
		
		System.out.println("save start...");
	}
	public Object getProxy(){
		
		Object proxy= Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
					beforeMethod();
					method.invoke(target, args);
				return null;
			}
		} );
		//返回代理对象
		return proxy;
	}
	

}

2.Test

@Test
	public void testProxy(){
		UserDAO userdao = new UserDAOImpl();
		LogInterceptor li = new LogInterceptor();
		li.setTarget(userdao);
		UserDAO proxy = (UserDAO) li.getProxy();
		proxy.save();
		
	}

创建userdao对象,再创建一个日志拦截器对象li,把被代理对象传给日志拦截器对象,返回一个代理对象proxy。proxy调用save方法。就会调用日志拦截器的beforeMethod方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值