不修改源码对程序功能进行拓展
几个重要概念
注解 | 说明 |
---|---|
Object getTarget() | 获取IoC容器内目标对象 |
Signature getSignature() | 获取目标方法 |
Object[] getArgs() | 获取目标方法参数 |
xml配置如下:
applicationContext.xml:
methodChecker:
package com.imooc.spring.aop.aspect;import org.aspectj.lang.ProceedingJoinPoint;import java.text.SimpleDateFormat;
import java.util.Date;/*** todo {类简要说明}** @Author wangw* @Date 2022/12/1 22:59* @Version 1.0*/
public class MethodChecker {// proceedingJoinPoint是原有JoinPoint的升级,在原有功能基础上,还能控制目标方法是否执行public Object check(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {try {long startTime = System.currentTimeMillis();Object ret = proceedingJoinPoint.proceed();long endTime = System.currentTimeMillis();long duration =endTime-startTime;if (duration>=1000){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss SSS");String className = proceedingJoinPoint.getTarget().getClass().getName();String methodName =proceedingJoinPoint.getSignature().getName();Object[] args =proceedingJoinPoint.getArgs();String now = sdf.format(new Date());System.out.println("======"+now+":"+className+"."+methodName+"."+"("+duration+")ms==============");}return ret;} catch (Throwable e) {throw e;}}
}
(静态代理 是指必须手动创建按代理类的代理模式使用方式)
private Object targetObj;public ProxyInvocationHandle(Object targetObj){this.targetObj =targetObj;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("前置执行方法");Object ret = method.invoke(targetObj,args);System.out.println("后置方法");return ret;}public static void main(String[] args) {UserService userService = new UserServiceImpl();ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle(userService);UserService userServiceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),proxyInvocationHandle);userServiceProxy.createUser();EmployeeService employeeService =new EmployeeServiceImpl();ProxyInvocationHandle proxyInvocationHandleProxy = new ProxyInvocationHandle(employeeService);EmployeeService employeeServiceProxy = (EmployeeService) Proxy.newProxyInstance(employeeService.getClass().getClassLoader(),employeeService.getClass().getInterfaces(),proxyInvocationHandleProxy);employeeServiceProxy.say();}
public interface EmployeeService {public void createNewEmployee();
}
public class EmployeeServiceImpl implements EmployeeService{public void say() {System.out.println("hello");}
}
使用代理时如果没有接口,则使用CGLib
上一篇:JVM内存模型剖析与优化
下一篇:从进程的角度来看JVM的内存分布