JDK动态代理
public class JDKProxyFactory {
public static Object getProxy(Class clazz){
//生成代理对象
Object proxy = Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Logger logger = new Logger();
Object obj = null;
try {
//前置增强
logger.m1();
//method.invoke:被代理的对象执行方法
method.invoke(clazz.newInstance(), args);
//后置增强
logger.m2();
} catch (IllegalAccessException e) {
e.printStackTrace();
logger.m3();
}
return obj;
}
});
return proxy;
}
}
cjlib动态代理
public class CglibProxyFactory {
public static Object getProxy(Class clazz){
//创建一个代理工具类
Enhancer enhancer = new Enhancer();
//根据父类创建子类对象(认爹)
enhancer.setSuperclass(clazz);
//调用代理对象方法(增强的代码写在这里)
enhancer.setCallback(new InvocationHandler() {
@Override
//参数一:代理对象本身(用不上)
//参数二:代理对象方法
//参数三:方法的参数
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Logger logger = new Logger();
//前置增强
logger.m1();
//执行被代理的方法
Object invoke = method.invoke(clazz.newInstance(),objects);
//后置增强
logger.m2();
return invoke;//返回返回执行的返回值
}
});
//生成代理对象并返回
Object proxy = enhancer.create();
return proxy;
}
}
AOP
切点
@Aspect//切面注解,标注在切面的类上
@Component
public class logger {
//@Pointcut标注一个切点
//切点表达式(execution)选中要增强的方法
// @Pointcut("execution(java.util.List com.itheima.service.impl.DeptServiceImpl.findAll())")
//* 模糊匹配1或多个字符
//..模糊匹配0或多个字符
//切点方式一
// @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
//切点方式二
@Pointcut("@annotation(com.itheima.annotation.LogAnno)")
public void pt(){}
//@Before方法之前执行
//指定被标注的方法(m1)在切点之前执行
// @Before("pt()")
// public void m1(){
// System.out.println("方法执行前运行");
// }
//
// @AfterReturning("pt()")
// public void m2(){
// System.out.println("方法返回结果后执行");
// }
// @AfterThrowing("pt()")
// public void m3(){
// System.out.println("方法异常后执行");
// }
// @After("pt()")
// public void m4(){
// System.out.println("方法结束后执行");
// }
//环绕通知
//ProceedingJoinPoint固定写法,返回Object固定写法
@Around("pt()")
public Object m5(ProceedingJoinPoint pjp){
Object object=null;
try {
System.out.println("方法执行前:执行了");
object = pjp.proceed();
System.out.println("方法执行后执行了(return后)");
} catch (Throwable e) {
e.printStackTrace();
System.out.println("方法异常了,执行");
}finally {
System.out.println("方法运行到最后完全结束了,执行了");
return object;
}
}
}
切入点表达式