Spring学习(2)

AOP思想的理解

AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。
在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。这就是他的主要应用方面,这里展示一个Log类。

public class AfterLog implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行了"+method.getName()+"方法,返回了"+returnValue);
    }
}

public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");
    }
}

为了适应开闭原则和减少原代码的修改,AOP的思想被逐渐应用。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。
Spring的AOP可以由三种方法实现,在这里我主要实现JDK原生方法实现。

JDK原生方法实现AOP

//这是一个万能的工具类,核心就是动态代理类Proxy实现InvocationHandler接口
public class Proxy implements InvocationHandler {
	//真实对象
	private Object target;
	
	/**
	 * 建立代理对象和真实对象的代理关系,并返回代理对象
	 */
	public Object bind(Object target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	
	/**
	 * 代理方法逻辑
	 *  porxy 代理对象
	 *  method 当前调度方法
	 *  args 当前方法参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("进入代理逻辑方法");
		System.out.println("在调度真实对象之前的服务");
		Object obj = method.invoke(target, args); //相当于调用sayHelloWorld方法
		System.out.println("在调度真实对象之后的服务");
		return obj;
	}
	
}
//接口和实现类通过代理类来主要操作,其是实现接口,不能是实现类
UserService usrService = (UserService) context.getBean("userService");
posted @ 2022-04-09 17:12  还要再努力一些吧  阅读(30)  评论(0)    收藏  举报