moving unit tests from .testsuite -> .aop
This commit is contained in:
@@ -144,7 +144,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
|
||||
private final Set<Object> nonAdvisedBeans = Collections.synchronizedSet(new HashSet<Object>());
|
||||
|
||||
private final Map<Object, Class> proxyTypes = new ConcurrentHashMap<Object, Class>();
|
||||
private final Map<Object, Class<?>> proxyTypes = new ConcurrentHashMap<Object, Class<?>>();
|
||||
|
||||
|
||||
/**
|
||||
@@ -253,12 +253,12 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
}
|
||||
|
||||
|
||||
public Class predictBeanType(Class beanClass, String beanName) {
|
||||
public Class<?> predictBeanType(Class<?> beanClass, String beanName) {
|
||||
Object cacheKey = getCacheKey(beanClass, beanName);
|
||||
return this.proxyTypes.get(cacheKey);
|
||||
}
|
||||
|
||||
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {
|
||||
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -268,7 +268,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
return wrapIfNecessary(bean, beanName, cacheKey);
|
||||
}
|
||||
|
||||
public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException {
|
||||
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
|
||||
Object cacheKey = getCacheKey(beanClass, beanName);
|
||||
|
||||
if (!this.targetSourcedBeans.contains(cacheKey)) {
|
||||
@@ -332,7 +332,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @param beanName the bean name
|
||||
* @return the cache key for the given class and name
|
||||
*/
|
||||
protected Object getCacheKey(Class beanClass, String beanName) {
|
||||
protected Object getCacheKey(Class<?> beanClass, String beanName) {
|
||||
return beanClass.getName() + "_" + beanName;
|
||||
}
|
||||
|
||||
@@ -379,7 +379,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @see org.aopalliance.intercept.MethodInterceptor
|
||||
* @see #shouldSkip
|
||||
*/
|
||||
protected boolean isInfrastructureClass(Class beanClass) {
|
||||
protected boolean isInfrastructureClass(Class<?> beanClass) {
|
||||
boolean retVal = Advisor.class.isAssignableFrom(beanClass) ||
|
||||
Advice.class.isAssignableFrom(beanClass) ||
|
||||
AopInfrastructureBean.class.isAssignableFrom(beanClass);
|
||||
@@ -398,7 +398,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @param beanName the name of the bean
|
||||
* @return whether to skip the given bean
|
||||
*/
|
||||
protected boolean shouldSkip(Class beanClass, String beanName) {
|
||||
protected boolean shouldSkip(Class<?> beanClass, String beanName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -412,7 +412,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @return a TargetSource for this bean
|
||||
* @see #setCustomTargetSourceCreators
|
||||
*/
|
||||
protected TargetSource getCustomTargetSource(Class beanClass, String beanName) {
|
||||
protected TargetSource getCustomTargetSource(Class<?> beanClass, String beanName) {
|
||||
// We can't create fancy target sources for directly registered singletons.
|
||||
if (this.customTargetSourceCreators != null &&
|
||||
this.beanFactory != null && this.beanFactory.containsBean(beanName)) {
|
||||
@@ -445,7 +445,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @see #buildAdvisors
|
||||
*/
|
||||
protected Object createProxy(
|
||||
Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {
|
||||
Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {
|
||||
|
||||
ProxyFactory proxyFactory = new ProxyFactory();
|
||||
// Copy our properties (proxyTargetClass etc) inherited from ProxyConfig.
|
||||
@@ -454,8 +454,8 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
if (!shouldProxyTargetClass(beanClass, beanName)) {
|
||||
// Must allow for introductions; can't just set interfaces to
|
||||
// the target's interfaces only.
|
||||
Class[] targetInterfaces = ClassUtils.getAllInterfacesForClass(beanClass, this.proxyClassLoader);
|
||||
for (Class targetInterface : targetInterfaces) {
|
||||
Class<?>[] targetInterfaces = ClassUtils.getAllInterfacesForClass(beanClass, this.proxyClassLoader);
|
||||
for (Class<?> targetInterface : targetInterfaces) {
|
||||
proxyFactory.addInterface(targetInterface);
|
||||
}
|
||||
}
|
||||
@@ -487,7 +487,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @return whether the given bean should be proxied with its target class
|
||||
* @see AutoProxyUtils#shouldProxyTargetClass
|
||||
*/
|
||||
protected boolean shouldProxyTargetClass(Class beanClass, String beanName) {
|
||||
protected boolean shouldProxyTargetClass(Class<?> beanClass, String beanName) {
|
||||
return (isProxyTargetClass() ||
|
||||
(this.beanFactory instanceof ConfigurableListableBeanFactory &&
|
||||
AutoProxyUtils.shouldProxyTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName)));
|
||||
@@ -591,6 +591,6 @@ public abstract class AbstractAutoProxyCreator extends ProxyConfig
|
||||
* @see #PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS
|
||||
*/
|
||||
protected abstract Object[] getAdvicesAndAdvisorsForBean(
|
||||
Class beanClass, String beanName, TargetSource customTargetSource) throws BeansException;
|
||||
Class<?> beanClass, String beanName, TargetSource customTargetSource) throws BeansException;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.framework;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.aop.SpringProxy;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
|
||||
/**
|
||||
* @author Rod Johnson
|
||||
* @author Chris Beams
|
||||
*/
|
||||
public class AopProxyUtilsTests {
|
||||
|
||||
@Test
|
||||
public void testCompleteProxiedInterfacesWorksWithNull() {
|
||||
AdvisedSupport as = new AdvisedSupport();
|
||||
Class<?>[] completedInterfaces = AopProxyUtils.completeProxiedInterfaces(as);
|
||||
assertEquals(2, completedInterfaces.length);
|
||||
List<?> ifaces = Arrays.asList(completedInterfaces);
|
||||
assertTrue(ifaces.contains(Advised.class));
|
||||
assertTrue(ifaces.contains(SpringProxy.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompleteProxiedInterfacesWorksWithNullOpaque() {
|
||||
AdvisedSupport as = new AdvisedSupport();
|
||||
as.setOpaque(true);
|
||||
Class<?>[] completedInterfaces = AopProxyUtils.completeProxiedInterfaces(as);
|
||||
assertEquals(1, completedInterfaces.length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompleteProxiedInterfacesAdvisedNotIncluded() {
|
||||
AdvisedSupport as = new AdvisedSupport();
|
||||
as.addInterface(ITestBean.class);
|
||||
as.addInterface(Comparable.class);
|
||||
Class<?>[] completedInterfaces = AopProxyUtils.completeProxiedInterfaces(as);
|
||||
assertEquals(4, completedInterfaces.length);
|
||||
|
||||
// Can't assume ordering for others, so use a list
|
||||
List<?> l = Arrays.asList(completedInterfaces);
|
||||
assertTrue(l.contains(Advised.class));
|
||||
assertTrue(l.contains(ITestBean.class));
|
||||
assertTrue(l.contains(Comparable.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompleteProxiedInterfacesAdvisedIncluded() {
|
||||
AdvisedSupport as = new AdvisedSupport();
|
||||
as.addInterface(ITestBean.class);
|
||||
as.addInterface(Comparable.class);
|
||||
as.addInterface(Advised.class);
|
||||
Class<?>[] completedInterfaces = AopProxyUtils.completeProxiedInterfaces(as);
|
||||
assertEquals(4, completedInterfaces.length);
|
||||
|
||||
// Can't assume ordering for others, so use a list
|
||||
List<?> l = Arrays.asList(completedInterfaces);
|
||||
assertTrue(l.contains(Advised.class));
|
||||
assertTrue(l.contains(ITestBean.class));
|
||||
assertTrue(l.contains(Comparable.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompleteProxiedInterfacesAdvisedNotIncludedOpaque() {
|
||||
AdvisedSupport as = new AdvisedSupport();
|
||||
as.setOpaque(true);
|
||||
as.addInterface(ITestBean.class);
|
||||
as.addInterface(Comparable.class);
|
||||
Class<?>[] completedInterfaces = AopProxyUtils.completeProxiedInterfaces(as);
|
||||
assertEquals(3, completedInterfaces.length);
|
||||
|
||||
// Can't assume ordering for others, so use a list
|
||||
List<?> l = Arrays.asList(completedInterfaces);
|
||||
assertFalse(l.contains(Advised.class));
|
||||
assertTrue(l.contains(ITestBean.class));
|
||||
assertTrue(l.contains(Comparable.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProxiedUserInterfacesWithSingleInterface() {
|
||||
ProxyFactory pf = new ProxyFactory();
|
||||
pf.setTarget(new TestBean());
|
||||
pf.addInterface(ITestBean.class);
|
||||
Object proxy = pf.getProxy();
|
||||
Class<?>[] userInterfaces = AopProxyUtils.proxiedUserInterfaces(proxy);
|
||||
assertEquals(1, userInterfaces.length);
|
||||
assertEquals(ITestBean.class, userInterfaces[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProxiedUserInterfacesWithMultipleInterfaces() {
|
||||
ProxyFactory pf = new ProxyFactory();
|
||||
pf.setTarget(new TestBean());
|
||||
pf.addInterface(ITestBean.class);
|
||||
pf.addInterface(Comparable.class);
|
||||
Object proxy = pf.getProxy();
|
||||
Class<?>[] userInterfaces = AopProxyUtils.proxiedUserInterfaces(proxy);
|
||||
assertEquals(2, userInterfaces.length);
|
||||
assertEquals(ITestBean.class, userInterfaces[0]);
|
||||
assertEquals(Comparable.class, userInterfaces[1]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProxiedUserInterfacesWithNoInterface() {
|
||||
Object proxy = Proxy.newProxyInstance(getClass().getClassLoader(), new Class[0],
|
||||
new InvocationHandler() {
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
try {
|
||||
AopProxyUtils.proxiedUserInterfaces(proxy);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.framework;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.util.StopWatch;
|
||||
|
||||
/**
|
||||
* Benchmarks for introductions.
|
||||
*
|
||||
* NOTE: No assertions!
|
||||
*
|
||||
* @author Rod Johnson
|
||||
* @author Chris Beams
|
||||
* @since 2.0
|
||||
*/
|
||||
public class IntroductionBenchmarkTests {
|
||||
|
||||
private static final int EXPECTED_COMPARE = 13;
|
||||
|
||||
/** Increase this if you want meaningful results! */
|
||||
private static final int INVOCATIONS = 100000;
|
||||
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public static class SimpleCounterIntroduction extends DelegatingIntroductionInterceptor implements Counter {
|
||||
public int getCount() {
|
||||
return EXPECTED_COMPARE;
|
||||
}
|
||||
}
|
||||
|
||||
public static interface Counter {
|
||||
int getCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void timeManyInvocations() {
|
||||
StopWatch sw = new StopWatch();
|
||||
|
||||
TestBean target = new TestBean();
|
||||
ProxyFactory pf = new ProxyFactory(target);
|
||||
pf.setProxyTargetClass(false);
|
||||
pf.addAdvice(new SimpleCounterIntroduction());
|
||||
ITestBean proxy = (ITestBean) pf.getProxy();
|
||||
|
||||
Counter counter = (Counter) proxy;
|
||||
|
||||
sw.start(INVOCATIONS + " invocations on proxy, not hitting introduction");
|
||||
for (int i = 0; i < INVOCATIONS; i++) {
|
||||
proxy.getAge();
|
||||
}
|
||||
sw.stop();
|
||||
|
||||
sw.start(INVOCATIONS + " invocations on proxy, hitting introduction");
|
||||
for (int i = 0; i < INVOCATIONS; i++) {
|
||||
counter.getCount();
|
||||
}
|
||||
sw.stop();
|
||||
|
||||
sw.start(INVOCATIONS + " invocations on target");
|
||||
for (int i = 0; i < INVOCATIONS; i++) {
|
||||
target.getAge();
|
||||
}
|
||||
sw.stop();
|
||||
|
||||
System.out.println(sw.prettyPrint());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user