1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.osgi.context.internal.classloader;
18
19 import java.lang.ref.WeakReference;
20 import java.util.Map;
21 import java.util.WeakHashMap;
22
23 import org.springframework.aop.framework.ProxyFactory;
24
25 /**
26 * Default implementation for {@link InternalAopClassLoaderFactory}. Uses an
27 * internal {@link WeakHashMap} to cache aop class loaders to prevent duplicated
28 * copies.
29 *
30 * @author Costin Leau
31 */
32 class CachingAopClassLoaderFactory implements InternalAopClassLoaderFactory {
33
34 private static final String CGLIB_CLASS = "net.sf.cglib.proxy.Enhancer";
35 /** CGLIB class (if it's present) */
36 private final Class cglibClass;
37
38 /** class loader -> aop class loader cache */
39 private final Map cache = new WeakHashMap();
40
41
42 CachingAopClassLoaderFactory() {
43
44 ClassLoader springAopClassLoader = ProxyFactory.class.getClassLoader();
45 Class clazz = null;
46 try {
47 clazz = springAopClassLoader.loadClass(CGLIB_CLASS);
48 }
49 catch (ClassNotFoundException cnfe) {
50
51 }
52 cglibClass = clazz;
53 }
54
55 public ClassLoader createClassLoader(ClassLoader classLoader) {
56
57 synchronized (cache) {
58 ClassLoader aopClassLoader = null;
59 WeakReference loaderReference = (WeakReference) cache.get(classLoader);
60
61 if (loaderReference != null) {
62 aopClassLoader = (ClassLoader) loaderReference.get();
63 }
64
65
66 if (aopClassLoader == null) {
67
68 if (cglibClass != null) {
69 aopClassLoader = new ChainedClassLoader(new ClassLoader[] { classLoader,
70 ProxyFactory.class.getClassLoader(), cglibClass.getClassLoader(),
71 CachingAopClassLoaderFactory.class.getClassLoader() });
72 }
73 else {
74 aopClassLoader = new ChainedClassLoader(new ClassLoader[] { classLoader,
75 ProxyFactory.class.getClassLoader(), CachingAopClassLoaderFactory.class.getClassLoader() });
76 }
77
78
79 cache.put(classLoader, new WeakReference(aopClassLoader));
80 }
81 return aopClassLoader;
82 }
83 }
84 }