diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java index 1e9ccc3068..4beff09bc3 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java @@ -126,9 +126,6 @@ class CglibAopProxy implements AopProxy, Serializable { */ public CglibAopProxy(AdvisedSupport config) throws AopConfigException { Assert.notNull(config, "AdvisedSupport must not be null"); - if (config.getAdvisorCount() == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) { - throw new AopConfigException("No advisors and no TargetSource specified"); - } this.advised = config; this.advisedDispatcher = new AdvisedDispatcher(this.advised); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxy.java index 9eeae4382c..81b48229ef 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxy.java @@ -104,9 +104,6 @@ final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializa */ public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException { Assert.notNull(config, "AdvisedSupport must not be null"); - if (config.getAdvisorCount() == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) { - throw new AopConfigException("No advisors and no TargetSource specified"); - } this.advised = config; this.proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true); findDefinedEqualsAndHashCodeMethods(this.proxiedInterfaces); 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 0d2efa711e..77b8858171 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 @@ -274,19 +274,9 @@ public class ProxyFactoryBean extends ProxyCreatorSupport return this.singletonInstance.getClass(); } } - Class[] ifcs = getProxiedInterfaces(); - if (ifcs.length == 1) { - return ifcs[0]; - } - else if (ifcs.length > 1) { - return createCompositeInterface(ifcs); - } - else if (this.targetName != null && this.beanFactory != null) { - return this.beanFactory.getType(this.targetName); - } - else { - return getTargetClass(); - } + // This might be incomplete since it potentially misses introduced interfaces + // from Advisors that will be lazily retrieved via setInterceptorNames. + return createAopProxy().getProxyClass(this.proxyClassLoader); } @Override @@ -295,19 +285,6 @@ public class ProxyFactoryBean extends ProxyCreatorSupport } - /** - * Create a composite interface Class for the given interfaces, - * implementing the given interfaces in one single Class. - *

The default implementation builds a JDK proxy class for the - * given interfaces. - * @param interfaces the interfaces to merge - * @return the merged interface as Class - * @see java.lang.reflect.Proxy#getProxyClass - */ - protected Class createCompositeInterface(Class[] interfaces) { - return ClassUtils.createCompositeInterface(interfaces, this.proxyClassLoader); - } - /** * Return the singleton instance of this class's proxy object, * lazily creating it if it hasn't been created already. diff --git a/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java b/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java index 1ad2ba6c88..a979f70177 100644 --- a/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java +++ b/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java @@ -97,12 +97,12 @@ public abstract class AbstractAopProxyTests { * to ensure that it was used appropriately by code. */ @BeforeEach - public void setUp() { + public void reset() { mockTargetSource.reset(); } @AfterEach - public void tearDown() { + public void verify() { mockTargetSource.verify(); } @@ -122,16 +122,6 @@ public abstract class AbstractAopProxyTests { } - @Test - public void testNoInterceptorsAndNoTarget() { - assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> { - AdvisedSupport pc = new AdvisedSupport(ITestBean.class); - //Add no interceptors - AopProxy aop = createAopProxy(pc); - aop.getProxy(); - }); - } - /** * Simple test that if we set values we can get them out again. */ diff --git a/spring-context/src/test/java/org/springframework/aop/framework/ProxyFactoryBeanTests.java b/spring-context/src/test/java/org/springframework/aop/framework/ProxyFactoryBeanTests.java index d78ea22909..8e0159f9eb 100644 --- a/spring-context/src/test/java/org/springframework/aop/framework/ProxyFactoryBeanTests.java +++ b/spring-context/src/test/java/org/springframework/aop/framework/ProxyFactoryBeanTests.java @@ -92,7 +92,7 @@ public class ProxyFactoryBeanTests { @BeforeEach - public void setUp() throws Exception { + public void setup() throws Exception { DefaultListableBeanFactory parent = new DefaultListableBeanFactory(); parent.registerBeanDefinition("target2", new RootBeanDefinition(TestApplicationListener.class)); this.factory = new DefaultListableBeanFactory(parent); @@ -473,8 +473,8 @@ public class ProxyFactoryBeanTests { public void testEmptyInterceptorNames() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(bf).loadBeanDefinitions(new ClassPathResource(INVALID_CONTEXT, CLASS)); - assertThatExceptionOfType(BeanCreationException.class).as("Interceptor names cannot be empty").isThrownBy(() -> - bf.getBean("emptyInterceptorNames")); + assertThat(bf.getBean("emptyInterceptorNames")).isInstanceOf(ITestBean.class); + assertThat(Proxy.isProxyClass(bf.getBean("emptyInterceptorNames").getClass())).isTrue(); } /** @@ -709,6 +709,7 @@ public class ProxyFactoryBeanTests { } } + /** * Aspect interface */