@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2014 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.
|
||||
@@ -27,14 +27,17 @@ import org.springframework.beans.factory.config.Scope;
|
||||
import org.springframework.core.NamedThreadLocal;
|
||||
|
||||
/**
|
||||
* Thread-backed {@link Scope} implementation.
|
||||
* A simple thread-backed {@link Scope} implementation.
|
||||
*
|
||||
* <p><strong>Note</strong> that the {@code SimpleThreadScope} <em>does not clean up any objects</em> associated
|
||||
* with it. As such, it's typically preferable to use the {@link org.springframework.web.context.request.RequestScope}
|
||||
* in Web environments.
|
||||
* <p><strong>Note:</strong> {@code SimpleThreadScope} <em>does not clean up
|
||||
* any objects</em> associated with it. As such, it is typically preferable to
|
||||
* use {@link org.springframework.web.context.request.RequestScope RequestScope}
|
||||
* in web environments.
|
||||
*
|
||||
* <p>For a implementation of a thread-based {@code Scope} with support for destruction callbacks, refer to <a
|
||||
* href="http://www.springbyexample.org/twiki/bin/view/Example/CustomThreadScopeModule">this module</a>.
|
||||
* <p>For an implementation of a thread-based {@code Scope} with support for
|
||||
* destruction callbacks, refer to the
|
||||
* <a href="http://www.springbyexample.org/examples/custom-thread-scope-module.html">
|
||||
* Spring by Example Custom Thread Scope Module</a>.
|
||||
*
|
||||
* <p>Thanks to Eugene Kuleshov for submitting the original prototype for a thread scope!
|
||||
*
|
||||
@@ -55,8 +58,9 @@ public class SimpleThreadScope implements Scope {
|
||||
}
|
||||
};
|
||||
|
||||
public Object get(String name, ObjectFactory objectFactory) {
|
||||
Map<String, Object> scope = threadScope.get();
|
||||
|
||||
public Object get(String name, ObjectFactory<?> objectFactory) {
|
||||
Map<String, Object> scope = this.threadScope.get();
|
||||
Object object = scope.get(name);
|
||||
if (object == null) {
|
||||
object = objectFactory.getObject();
|
||||
@@ -66,13 +70,13 @@ public class SimpleThreadScope implements Scope {
|
||||
}
|
||||
|
||||
public Object remove(String name) {
|
||||
Map<String, Object> scope = threadScope.get();
|
||||
Map<String, Object> scope = this.threadScope.get();
|
||||
return scope.remove(name);
|
||||
}
|
||||
|
||||
public void registerDestructionCallback(String name, Runnable callback) {
|
||||
logger.warn("SimpleThreadScope does not support descruction callbacks. " +
|
||||
"Consider using a RequestScope in a Web environment.");
|
||||
logger.warn("SimpleThreadScope does not support destruction callbacks. " +
|
||||
"Consider using RequestScope in a web environment.");
|
||||
}
|
||||
|
||||
public Object resolveContextualObject(String key) {
|
||||
|
||||
@@ -16,18 +16,13 @@
|
||||
|
||||
package org.springframework.aop.framework;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
import org.junit.Test;
|
||||
import test.mixin.LockMixinAdvisor;
|
||||
|
||||
import org.springframework.aop.ClassFilter;
|
||||
import org.springframework.aop.MethodMatcher;
|
||||
import org.springframework.aop.Pointcut;
|
||||
@@ -42,10 +37,11 @@ import org.springframework.tests.aop.interceptor.NopInterceptor;
|
||||
import org.springframework.tests.sample.beans.ITestBean;
|
||||
import org.springframework.tests.sample.beans.TestBean;
|
||||
|
||||
import test.mixin.LockMixinAdvisor;
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Additional and overridden tests for the CGLIB proxy.
|
||||
* Additional and overridden tests for CGLIB proxies.
|
||||
*
|
||||
* @author Rod Johnson
|
||||
* @author Juergen Hoeller
|
||||
@@ -56,7 +52,8 @@ import test.mixin.LockMixinAdvisor;
|
||||
@SuppressWarnings("serial")
|
||||
public final class CglibProxyTests extends AbstractAopProxyTests implements Serializable {
|
||||
|
||||
private static final String DEPENDENCY_CHECK_CONTEXT = CglibProxyTests.class.getSimpleName() + "-with-dependency-checking.xml";
|
||||
private static final String DEPENDENCY_CHECK_CONTEXT =
|
||||
CglibProxyTests.class.getSimpleName() + "-with-dependency-checking.xml";
|
||||
|
||||
|
||||
@Override
|
||||
@@ -354,7 +351,6 @@ public final class CglibProxyTests extends AbstractAopProxyTests implements Seri
|
||||
@Test
|
||||
public void testAddAdviceAtRuntime() {
|
||||
TestBean bean = new TestBean();
|
||||
|
||||
CountingBeforeAdvice cba = new CountingBeforeAdvice();
|
||||
|
||||
ProxyFactory pf = new ProxyFactory();
|
||||
@@ -364,17 +360,13 @@ public final class CglibProxyTests extends AbstractAopProxyTests implements Seri
|
||||
pf.setProxyTargetClass(true);
|
||||
|
||||
TestBean proxy = (TestBean) pf.getProxy();
|
||||
|
||||
assertTrue(AopUtils.isCglibProxy(proxy));
|
||||
|
||||
proxy.getAge();
|
||||
|
||||
assertEquals(0, cba.getCalls());
|
||||
|
||||
((Advised) proxy).addAdvice(cba);
|
||||
|
||||
proxy.getAge();
|
||||
|
||||
assertEquals(1, cba.getCalls());
|
||||
}
|
||||
|
||||
@@ -386,7 +378,6 @@ public final class CglibProxyTests extends AbstractAopProxyTests implements Seri
|
||||
proxyFactory.setProxyTargetClass(true);
|
||||
|
||||
MyBean proxy = (MyBean) proxyFactory.getProxy();
|
||||
|
||||
assertEquals(4, proxy.add(1, 3));
|
||||
assertEquals(1, advice.getCalls("add"));
|
||||
}
|
||||
@@ -444,7 +435,6 @@ public final class CglibProxyTests extends AbstractAopProxyTests implements Seri
|
||||
public final void foo() {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -481,7 +471,6 @@ class NoArgCtorTestBean {
|
||||
public void reset() {
|
||||
called = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -490,15 +479,11 @@ class ProtectedMethodTestBean {
|
||||
protected String getString() {
|
||||
return "foo";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class UnsupportedInterceptor implements MethodInterceptor {
|
||||
|
||||
/**
|
||||
* @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
|
||||
*/
|
||||
@Override
|
||||
public Object invoke(MethodInvocation mi) throws Throwable {
|
||||
throw new UnsupportedOperationException(mi.getMethod().getName());
|
||||
|
||||
Reference in New Issue
Block a user