From c589f5c3254ae2793c60231a4662ed6d0dac0a9e Mon Sep 17 00:00:00 2001 From: Marijn Meijles Date: Sun, 16 Jul 2017 22:28:04 +0200 Subject: [PATCH] Rebuild Advisor chain when interceptor list is updated When getObject() on ProxyFactoryBean is called it might not be fully initialized yet, leading to an exception. This is fine, but the empty Advisor chain is never rebuilt, not even after initialization has finished. This leads to 'no-op' proxies which don't do anything. Issue: SPR-7582 --- .../springframework/aop/framework/AdvisedSupport.java | 5 +++++ .../springframework/aop/framework/ProxyFactoryBean.java | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AdvisedSupport.java b/spring-aop/src/main/java/org/springframework/aop/framework/AdvisedSupport.java index efa0e1e8b5a5..4a963f537c2c 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AdvisedSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AdvisedSupport.java @@ -391,6 +391,11 @@ protected final List getAdvisorsInternal() { return this.advisors; } + protected void clearAdvisors() { + this.advisors.clear(); + updateAdvisorArray(); + adviceChanged(); + } @Override public void addAdvice(Advice advice) throws AopConfigException { diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactoryBean.java b/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactoryBean.java index d224a93a1a6b..408d4c032666 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactoryBean.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactoryBean.java @@ -163,6 +163,7 @@ public void setProxyInterfaces(Class[] proxyInterfaces) throws ClassNotFoundE */ public void setInterceptorNames(String... interceptorNames) { this.interceptorNames = interceptorNames; + initializeAdvisorChain(); } /** @@ -248,7 +249,9 @@ public void setBeanFactory(BeanFactory beanFactory) { */ @Override public Object getObject() throws BeansException { - initializeAdvisorChain(); + if (!this.advisorChainInitialized) { + initializeAdvisorChain(); + } if (isSingleton()) { return getSingletonInstance(); } @@ -430,9 +433,7 @@ private boolean isNamedBeanAnAdvisorOrAdvice(String beanName) { * are unaffected by such changes. */ private synchronized void initializeAdvisorChain() throws AopConfigException, BeansException { - if (this.advisorChainInitialized) { - return; - } + clearAdvisors(); if (!ObjectUtils.isEmpty(this.interceptorNames)) { if (this.beanFactory == null) {