时间:2015-07-02 来源:

SpringAOP深入理解之拦截器调用 【编程语言】

Spring AOP深入理解之拦截器调用

拦截器链的获取web前端制作, targetClass)

@Override public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException { List<MethodInterceptor> interceptors = new ArrayList<MethodInterceptor>(3); Advice advice = advisor.getAdvice(); if (advice instanceof MethodInterceptor) { interceptors.add((MethodInterceptor) advice); } for (AdvisorAdapter adapter : this.adapters) { if (adapter.supportsAdvice(advice)) { interceptors.add(adapter.getInterceptor(advisor)); } } if (interceptors.isEmpty()) { throw new UnknownAdviceTypeException(advisor.getAdvice()); } return interceptors.toArray(new MethodInterceptor[interceptors.size()]); }

来看看invokeJoinpointUsingReflection(),即上面所说的目标对象方法的调用,div前端切图其实是通过AopUtils的方法调用web切图报价,使用反射机制来对目标对象的方法进行的:

invocation是一个new ReflectiveMethodInvocation()实例,手机html制作找到ReflectiveMethodInvocation的proceed()方法

classloader类加载器符合w3c标准,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

所以registry其实为调用了DefaultAdvisorAdapterRegistry的构造函数,符合w3c标准然后才能在将Advisor转化成Interceptor时网页外包接活,调用DefaultAdvisorAdapterRegistry的getInterceptors()方法.

看看拦截器对象,jpg或psd转html即ReflectiveMethodInvocation中proceed()方法的调用

目标对象方法的调用web前端制作,即invokeJoinpointUsingReflection()方法拦截器对象方法的调用,web前端制作即ReflectiveMethodInvocation中proceed()

proxiedInterfaces,一个Interface对象的数组,承接网页制作表示的是我将要给我需要代理的对象提供一组什么接口

回顾下JdkDynamicAopProxy中生成proxy方法

上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是如何生成的web切图报价,其中重点介绍了JDK动态代理方式,网站div+css简单回顾下代理对象生成过程:

public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, method, cached); } return cached; }

进入AdvisedSupport(advised为AdvisedSupport实例)的getInterceptorsAndDynamicInterceptionAdvice()方法

@Override public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource()); } Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised); findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, this); }

首先看拦截器链是如获得的.

在动态代理这篇博客中我们分析过承接网页制作,生成的proxy代理类被调用时,承接网页制作会调用super.h.method()方法web切图报价,而Proxy中有一个InvocationHandler,正好可以匹配上面代码中的 MethodInterceptor[]interceptors = registry.getInterceptors(advisor);

1、上面讲到了两种生成代理对象的方法网页外包接活,一种是通过ProxyFactoryBean.第一种获取比较简单web前端制作,但是需要手工的进行写代码,web前端制作而第二种是通过Spring的IOC机制来控制Bean的生成. 2、无论是ProxyFactory或者ProxyFactoryBean都是要通过createAopProxy().getProxy()来获取相应的代理对象承接网页制作,而通过Proxyfactory比较直接,div前端切图上面重点介绍的是通过ProxyFactoryBean获得proxy. 3、首先web切图报价,找到ProxyFactoryBean的getObject方法,手机html制作为什么?(主要是跟Bean容器中getObject能返回代理对象) 4、其次调用getSingletonInstance(),在getSingletonInstance方法中引入了super中的方法,符合w3c标准super是指ProxyCreatorSupport,这里ProxyCreatorSupport是ProxyFactoryBean和ProxyFactory的父类,jpg或psd转html已经做了很多工作web前端制作,只需在ProxyFactoryBean的getObject()方法中通过父类的createAopProxy()取得相应的AopProxy. 5、跟踪createAopProxy方法,web前端制作追踪到了ProxyCreatorSupport中承接网页制作,然后,承接网页制作借助了AopProxyFactory,在构造函数中已经定义为DefaultAopProxyFactory 6、进入DefaultAopProxyFactory中符合w3c标准,找到createAopProxy方法,符合w3c标准在这里判断是调用JDK动态或者CGlib动态中的一种.

/** * 从提供的配置实例config中获取advisor列表网页外包接活, * 则判断此Advisor能否应用到目标类targetClass上.如果是PointcutAdvisor, Methodmethod,targetClass); //这里实际上注册一系列AdvisorAdapter,method, hasIntroductions)) { if(mm.isRuntime()) { // Creating a newobject instance in the getInterceptors() method // isn't a problemas we normally cache created chains. for (intj = 0; j < interceptors.length; j++) { interceptorList.add(new InterceptorAndDynamicMethodMatcher(interceptors[j], proxiedInterfaces, this).这个地方的三个参数在博客动态代理中做过详细介绍,web前端制作再回顾下

AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance(); instance = new DefaultAdvisorAdapterRegistry(); public DefaultAdvisorAdapterRegistry() { registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); registerAdvisorAdapter(new AfterReturningAdviceAdapter()); registerAdvisorAdapter(new ThrowsAdviceAdapter()); }

public static Object invokeJoinpointUsingReflection(Object target, Object[] args) throws Throwable { // 通过反射机制来获得相应的方法web切图报价, args); } catch (InvocationTargetException ex) { throw ex.getTargetException(); } catch (IllegalArgumentException ex) { throw new AopInvocationException("AOP configuration seems to be invalid: tried calling method [" + method + "] on target [" + target + "]", ex); } } 拦截器方法执行

目标对象方法的调用

@Override public Object invoke(Object proxy, Object[] args) throws Throwable { MethodInvocation invocation; Object oldProxy = null; boolean setProxyContext = false; TargetSource targetSource = this.advised.targetSource; Class<?> targetClass = null; Object target = null; try { if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) { //目标对象未实现equals方法 return equals(args[0]); } if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) { //目标对象未实现hashcode方法 return hashCode(); } if (!this.advised.opaque && method.getDeclaringClass().isInterface() && method.getDeclaringClass().isAssignableFrom(Advised.class)) { //这里就是目标对象方法的调用 return AopUtils.invokeJoinpointUsingReflection(this.advised, args); } Object retVal; if (this.advised.exposeProxy) { // 获得当前的对象 oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } //目标对象可能源自一个池或者一个简单的方法 target = targetSource.getTarget(); if (target != null) { targetClass = target.getClass(); } // 得到拦截器链 List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); // 检查是否定义了拦截器方法,承接网页制作如果没有的话直接调用目标方法 if (chain.isEmpty()) { retVal = AopUtils.invokeJoinpointUsingReflection(target, args); } else { //我们需要创建一个调用方法 invocation = new ReflectiveMethodInvocation(proxy, method, targetClass, target, args, chain); retVal = invocation.proceed();

this,表示JdkDynamicAopProxy自身,html切图制作因为JdkDynamicAopProxy实现了InvocationHandler接口

注意上面代码中的一行网页外包接活,找到GlobalAdvisorAdapterRegistry,又是default~~~

private int currentInterceptorIndex = -1; @Override public Object proceed() throws Throwable { // currentInterceptorIndex初始化的长度为-1,下面就就是判断 //interceptorsAndDynamicMethodMatchers长度是否为0 if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { return invokeJoinpoint(); } Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) { //匹配是否为正确的方法逻辑,div前端切图(MethodMatcher)可以看出为匹配如果不是就调用下一个 InterceptorAndDynamicMethodMatcher dm = (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice; if (dm.methodMatcher.matches(this.method, this.arguments)) { return dm.interceptor.invoke(this); } else { //匹配失败符合w3c标准,跳过这个拦截器,符合w3c标准继续下一个 return proceed(); } } else { // 如果是interceptor,则调用invoke方法,jpg或psd转html这是为了兼容 return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); } } 版权声明:本文为博主原创文章web前端制作,未经博主允许不得转载.

既然代理对象已经生成,web前端制作那么拦截器是如何被调用的呢

Spring AOP代理对象生成回顾

可以看出上面方法用到缓存的承接网页制作, 假设现在缓存没有相应的拦截器,承接网页制作 则到 AdvisorChainFactory 的相应方法中获取web切图报价,发现定义为new DefaultAdvisorChainFactory(),这里是不是有一点眼熟,符合w3c标准对的网页外包接活,进入DefaultAdvisorChainFactory中的相应方法web前端制作,比较长

点击次数:12982
作者:
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日外键约束列没建索引导致大量librarycachepinlibrarycachelock 【移动开发】2015年06月29日php中使用DOM类读取XML文件的实现代码2014年01月29日另类提取Word中图片的方法2014年01月28日swift详解之十二-----------------泛型 【移动开发】2015年08月27日服务器死机的常见六种原因2014年01月28日安卓中四种点击事件【综合】2015年08月17日MongoDB(1)--简介以及安装【编程语言】2015年08月25日支付宝信用卡充值今起关闭部分银行调高上限 ,,2016年07月24日《开源公开课分享》:Java开源框架案例分享【编程语言】2015年08月14日Flash,EEPROM区别 【综合】2015年07月13日c++_benchMark_vector_list_deque 【编程语言】2015年08月03日指针的点运算和箭头运算(->) 【系统运维】2015年05月28日Hibernate——以面向对象的思维操作关系数据库(一)【Web前端】2015年03月02日Codeforcesgym100517(二分,同方向判断) 【Web前端】2015年07月31日ASP.NET技巧:access下的分页方案2014年01月29日一览新的AndroidGradle构建工具:新的DSL结构和Gradle2.5 【综合】2015年07月23日给.net初学者的一些建议(共勉之)2014年01月29日Android设备使用网络连接调试 【移动开发】2015年01月20日HTC被指前景黯淡:可能会成为被收购目标 ,,2016年07月24日uva657Thedieiscast(双重搜索)【综合】2015年07月22日C#DES加密与解密【编程语言】2015年05月05日室内地图商场停车场室内定位导航拓展方案应用 【编程语言】2015年06月11日实用:IE浏览器精典技巧两则2014年01月29日orderby优化-mysql 【云计算】2015年06月01日Linux操作系统应用服务器的常用备份的方法2014年01月28日hdu1403---LongestCommonSubstring(后缀数组求2个字符串的最长公共子串) 【编程语言】2015年04月13日HDU3182HamburgerMagi(状压dp) 【移动开发】2015年03月26日sed修连接文件,有坑 【数据库】2015年06月11日梦情俱乐部【编程语言】2014年12月25日Java构造器内部的多态方法的行为 【移动开发】2015年02月28日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)