Spring-7-AOP
概述 分类
- Spring-仅方法
- JDK:动态代理-ProxyGenerator
- CGLib:字节码生成器-ClassGenerator
- JBoss:自定义类加载器(可属性,方法,构造器)
- 代码生成工具:利用工具在现有代码上添加新的代码
- 语言扩展:对方法和属性进行增强,AspectJ就是用的这种(可属性,方法,构造器)
- 切面(Aspect):横切关注点的抽象(何时在何处做什么)(Advisor)
- 连接点(Joinpoint):能被拦截的点,即能应用通知的点
- 切入点(Pointcut):对连接点进行拦截的规则定义(何处)
- 通知(Advice):拦截到连接点后要执行的代码(何时做什么)
- 目标对象(Target):被代理者
- 织入(Weave):将切面应用到目标对象,导致代理对象的创建(对方法的增强)
- 引入(Introduction):运行期为类动态地添加方法或字段(对类的增强)
- MethodInterceptor,MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice
- AspectJProxyFactory
- Spring与AspectJ的结合
- ProxyFactory
- 需编程式
- ProxyFactoryBean
- 可声明式,借助IoC容器
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new GreetingImpl());
proxyFactory.addAdvice(new GreetingBeforeAndAfterAdvice());
proxyFactory.addAdvice(new GreetingAroundAdvice());
Greeting greeting = (Greeting) proxyFactory.getProxy();
greeting.sayHello("Jack");
GreetingBeforeAndAfterAdvice implements MethodBeforeAdvice, AfterReturningAdvice
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("GreetingBeforeAndAfterAdvice: After");
}
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("GreetingBeforeAndAfterAdvice: Before");
}GreetingAroundAdvice implements MethodInterceptor
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
before();
Object result = invocation.proceed();
after();
return result;
}
ProxyFactoryBean
文章图片
aop-001.JPG
com.fjh.aop.ITarget
aAdvice
【Spring-7-AOP】
- 生成ppp
- 这里有个注意点,xml中配的接口是字符串,因为在ProxyFactoryBean中是Class> []类型,在IoC的populateBean过程中,有个convertForProperty的环节,把String加载生成Class对象,并作为数组元素
- initializeAdvisorChain
- 将aAdvice先裹成Advisor,塞到LinkedList
- 有适配器的影子:MethodBeforeAdviceAdapter
- 由DefaultAopProxyFactory获取AopProxy,可能是jdk,也可能是cglib;调用AopProxy.getProxy
- 配置了或者没有接口,并且target本身不是接口,也不是被Proxy生成的代理类,那么采用cglib,否则采用jdk
- 因为生成的$Proxy2只实现了ITarget,所以报ClassCastException
- 抛AopInvocationException,method.invoke(target, args),因为method不属于target的方法;不过target有个同名方法啊,怎么判断呢,判断method所属接口或类?
推荐阅读
- 深入理解Go之generate
- jQuery插件
- 1.2序列通用操作
- Flutter自定义view|Flutter自定义view —— 闯关进度条
- 茶叶分类(五)(茶叶分为六大类,做茶的人只分两类)
- 2018年|2018年 Bible study 01/02/2018
- #读书笔记#流量池Day|#读书笔记#流量池Day 1 文沫
- 权限管理-linux常用命令大全[功能分类]
- 基金课程学习笔记分享-2(基金的分类)
- python对数据进行分类|python对数据进行分类、文件是csv文件_用Python将处理数据得到的csv文件分类(按顺序)保存...