【软件开发】Spring 面向切面编程(头歌作业)
第1关:使用前后置通知统计所有方法的执行时间
package Educoder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@Component("BlogAdvice")
@Aspect
public class BlogAdvice {
//定义切点
@Pointcut("execution(* Educoder.BlogService.service*(..))")
public void My() {
}
//定义前置通知,输出当前时间2019.1.1 00:00:00
/********** Begin **********/
@Before("My()")
public void before() {
System.out.println("当前时间2019.1.1 00:00:00");
}
/********** End **********/
//定义后置通知,输出当前时间2019.1.1 00:01:00,执行耗时60000
/********** Begin **********/
@After("My()")
public void after() {
System.out.println("当前时间2019.1.1 00:01:00,执行耗时60000");
}
/********** End **********/
}
第2关:使用环绕通知统计所有带参方法的执行时间
package Educoder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@Component("BlogAdvice")
@Aspect
public class BlogAdvice {
//定义切点
@Pointcut("execution(* Educoder.BlogService.service*(..))")
public void My() {
}
//定义环绕通知,实现统计目标类所有带参方法运行时长
@Around("My()")
public void around(ProceedingJoinPoint point) throws ParseException, InterruptedException {
/********** Begin **********/
String startStr = "2019.1.1 00:00:00";
String endStr = "2019.1.1 00:01:00";
if(point.getArgs().length>0){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
long start = sdf.parse(startStr).getTime();
try {
point.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
long end = sdf.parse(endStr).getTime();
System.out.println("程序a执行耗时" + (end - start));
}
/********** End **********/
}
}
第3关:AOP实现原理-JDK动态代理
package educoder;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy {
public static UserService createUserService(){
//请在以下提示框内填写你的代码
/**********Begin**********/
//目标类
UserServiceImpl userService = new UserServiceImpl();
//切面类
Authority authority = new Authority();
//代理类:将目标类与切面类结合
UserService proxyUserService1 = (UserService) Proxy.newProxyInstance(MyProxy.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行目标方法前
authority.before();
//放行
Object invoke = method.invoke(userService, args);
//执行目标方法后
return invoke;
}
});
//返回代理对象
return proxyUserService1;
/**********End**********/
}
}
第4关:AOP实现原理-CgLib动态代理
package educoder;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy {
public static UserServiceImpl createUserService(){
//请在以下提示框内填写你的代码
/**********Begin**********/
//目标类
UserServiceImpl userService = new UserServiceImpl();
//切面类
Authority authority = new Authority();
//cglib核心类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(userService.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//目标方法执行前
authority.before();
//放行目标方法
Object invoke = methodProxy.invokeSuper(o,objects);
//目标方法执行后
return invoke;
}
});
//获取代理对象
UserServiceImpl proxy = (UserServiceImpl) enhancer.create();
//返回代理对象
return proxy;
/**********End**********/
}
}