千家信息网

Spring Framework中DefaultAdvisorChainFactory类案例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Spring Framework中DefaultAdvisorChainFactory类案例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
千家信息网最后更新 2026年11月02日Spring Framework中DefaultAdvisorChainFactory类案例分析

这篇文章主要讲解了"Spring Framework中DefaultAdvisorChainFactory类案例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring Framework中DefaultAdvisorChainFactory类案例分析"吧!

Spring版本是5.0.4.release.

JdkDynamicAopProxy中使用到了拦截器链,如下List-1,advised是ProxyFactory,而方法getInterceptorsAndDynamicInterceptionAdvice则是在其父类AdvisedSupport中。

List-1

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                ...                // Get the interception chain for this method.                List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);                ...}

如下List-2,advisorChainFactory是DefaultAdvisorChainFactory

List-2

public List getInterceptorsAndDynamicInterceptionAdvice(Method method, @Nullable Class targetClass) {        MethodCacheKey cacheKey = new MethodCacheKey(method);        List cached = this.methodCache.get(cacheKey);        if (cached == null) {                cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(                                this, method, targetClass);                this.methodCache.put(cacheKey, cached);        }        return cached;}

getInterceptorsAndDynamicInterceptionAdvice的方法实现如下List-3所示,会将Advisor转换为Interceptor,List-3中的registry是DefaultAdvisorAdapterRegistry。

List-3

public class DefaultAdvisorChainFactory implements AdvisorChainFactory, Serializable {        @Override        public List getInterceptorsAndDynamicInterceptionAdvice(                        Advised config, Method method, @Nullable Class targetClass) {                        ...                        Interceptor[] interceptors = registry.getInterceptors(advisor);                        ...                             return interceptorList;        }        ...

如下List-4所示,构造方法中注册了Adapter,而后getInterceptors方法中会使用模板模式将advisor中的advice转换为MethodInterceptor。

List-4

public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable {        private final List adapters = new ArrayList<>(3);        public DefaultAdvisorAdapterRegistry() {                registerAdvisorAdapter(new MethodBeforeAdviceAdapter());                registerAdvisorAdapter(new AfterReturningAdviceAdapter());                registerAdvisorAdapter(new ThrowsAdviceAdapter());        }        @Override        public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException {                List interceptors = new ArrayList<>(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[0]);        }        ...

来看个例子,如下List-5所示,MethodBeforeAdviceAdapter的supportsAdvice方法中判断是否是MethodBeforeAdvice;getInterceptor方法中将advice封装到MethodBeforeAdviceInterceptor中。

List-5

class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {        @Override        public boolean supportsAdvice(Advice advice) {                return (advice instanceof MethodBeforeAdvice);        }        @Override        public MethodInterceptor getInterceptor(Advisor advisor) {                MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();                return new MethodBeforeAdviceInterceptor(advice);        }}

MethodBeforeAdviceInterceptor的代码如下,比较简单,主要是invoke方法,会先调用MethodBeforeAdvice的before方法,之后才会执行MethodInvocation的invoke方法。

List-6

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {        private final MethodBeforeAdvice advice;        public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {                Assert.notNull(advice, "Advice must not be null");                this.advice = advice;        }        @Override        public Object invoke(MethodInvocation mi) throws Throwable {                this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());                return mi.proceed();        }}

整体来看DefaultAdvisorChainFactory会将我们的advice转换为MethodInerceptor,而不同的Advice实现,对应的MethodInterceptor实现也不一样,进而实现Before、After的拦截实现。

从Spring容器中获取bean的时候,用于这个bean的拦截器就构造好,且与这个目标类封装在一起,之后当调用这个目标类的方法时,就会再次构造拦截器链,为什么会再次构造拦截器链是因为有些拦截器只作用与目标类的部分方法,不过这个基于方法层面的拦截器还是做了缓存的。

感谢各位的阅读,以上就是"Spring Framework中DefaultAdvisorChainFactory类案例分析"的内容了,经过本文的学习后,相信大家对Spring Framework中DefaultAdvisorChainFactory类案例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 拦截器 案例 案例分析 分析 目标 学习 内容 再次 封装 不同 中将 代码 作用 例子 容器 就是 层面 思路 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会副主任毛军 互联网科技公司华为 科技互联网政务服务 北京互联网科技公司 汇久创客互联网科技 火传媒上海互联网科技 人人互联网科技是培训 美国互联网前沿科技 互联网科技类展会 互联网巨头投资的硬核科技 汉立互联网科技有限公司联系电话 开启互联网科技时代小说 互联网企业和科技型企业 广州恒生互联网科技有限 赶超互联网科技 微信多开 速维有品互联网信息科技(苏州)有限公司 中国互联网十大科技股排名 银川新华互联网科技学校联系电话 互联网科技收购价值 福仕德教育科技互联网 哈尔滨大商圈互联网科技有限公司 广州紫鲸互联网科技有限公司 为想互联网科技怎么样 智网互联网科技 凡科互联网科技 润盈互联网科技 宁波青枫互联网科技有限公司 晓花互联网科技有限公司网址 福仕德教育科技互联网 玉溪新华互联网科技怎么选
0