下面列出了org.springframework.util.ClassUtils#overrideThreadContextClassLoader ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Test
public void componentScanJarFunction() {
try {
create("greeter.jar", ComponentScanJarConfiguration.class);
assertThat(this.context.getBean("greeter")).isInstanceOf(Function.class);
assertThat((Function<?, ?>) this.catalog.lookup(Function.class, "greeter"))
.isInstanceOf(Function.class);
assertThat(this.inspector
.getInputType(this.catalog.lookup(Function.class, "greeter")))
.isAssignableFrom(String.class);
assertThat(this.inspector
.getInputWrapper(this.catalog.lookup(Function.class, "greeter")))
.isAssignableFrom(String.class);
}
finally {
ClassUtils.overrideThreadContextClassLoader(getClass().getClassLoader());
}
}
@Override
@TearDown(Level.Invocation)
public void close() throws IOException {
// CachedIntrospectionResults.clearClassLoader(getClass().getClassLoader());
if (instance != null) {
instance.close();
}
if (runThread != null) {
runThread.setContextClassLoader(null);
runThread = null;
}
if (orig != null) {
ClassUtils.overrideThreadContextClassLoader(orig);
}
if (loader != null) {
try {
loader.close();
loader = null;
}
catch (Exception e) {
System.err.println("Failed to close loader " + e);
}
}
System.gc();
for (Object key : this.args.keySet()) {
System.clearProperty(key.toString());
}
}
private Class<?> loadMainClass(Class<?> type) throws ClassNotFoundException {
URL[] urls = filterClassPath(
((URLClassLoader) getClass().getClassLoader()).getURLs());
loader = new URLClassLoader(urls, getClass().getClassLoader().getParent());
orig = ClassUtils.overrideThreadContextClassLoader(loader);
return loader.loadClass(type.getName());
}
private void create(String jarfile, Class<?> config, String... props) {
try {
URL[] urls = new URL[] { new ClassPathResource(jarfile).getURL() };
ClassUtils.overrideThreadContextClassLoader(
new URLClassLoader(urls, getClass().getClassLoader()));
create(config, props);
}
catch (Exception e) {
ReflectionUtils.rethrowRuntimeException(e);
}
}
@Override
public T apply(S item) {
ClassLoader context = ClassUtils
.overrideThreadContextClassLoader(this.classLoader);
try {
return this.function.apply(item);
}
finally {
ClassUtils.overrideThreadContextClassLoader(context);
}
}
@Override
public void accept(T item) {
ClassLoader context = ClassUtils
.overrideThreadContextClassLoader(this.classLoader);
try {
this.consumer.accept(item);
}
finally {
ClassUtils.overrideThreadContextClassLoader(context);
}
}
@Override
public T get() {
ClassLoader context = ClassUtils
.overrideThreadContextClassLoader(this.classLoader);
try {
return this.supplier.get();
}
finally {
ClassUtils.overrideThreadContextClassLoader(context);
}
}
/**
* 该构造函数用于集群环境
*
* @throws BeansException
*/
public SpringJobBeanFactory(ClassLoader classLoader) throws BeansException {
this.classLoader = classLoader;
ClassUtils.overrideThreadContextClassLoader(classLoader);
this.applicationContext = new ClassPathXmlApplicationContext(JobScanner.APPLICATION_CONTEXT_XML_PATH);
}
private void overrideClassLoaderForRestart() {
ClassUtils.overrideThreadContextClassLoader(
this.application.getClass().getClassLoader());
}
/**
* Override the thread context ClassLoader with the environment's bean ClassLoader
* if necessary, i.e. if the bean ClassLoader is not equivalent to the thread
* context ClassLoader already.
* @return the original thread context ClassLoader, or {@code null} if not overridden
*/
@Nullable
protected ClassLoader overrideThreadContextClassLoader() {
return ClassUtils.overrideThreadContextClassLoader(getBeanClassLoader());
}
/**
* Override the thread context ClassLoader with the environment's bean ClassLoader
* if necessary, i.e. if the bean ClassLoader is not equivalent to the thread
* context ClassLoader already.
* @return the original thread context ClassLoader, or {@code null} if not overridden
*/
@Nullable
protected ClassLoader overrideThreadContextClassLoader() {
return ClassUtils.overrideThreadContextClassLoader(getBeanClassLoader());
}
/**
* Override the thread context ClassLoader with the environment's bean ClassLoader
* if necessary, i.e. if the bean ClassLoader is not equivalent to the thread
* context ClassLoader already.
* @return the original thread context ClassLoader, or {@code null} if not overridden
*/
protected ClassLoader overrideThreadContextClassLoader() {
return ClassUtils.overrideThreadContextClassLoader(getBeanClassLoader());
}
/**
* Override the thread context ClassLoader with the environment's bean ClassLoader
* if necessary, i.e. if the bean ClassLoader is not equivalent to the thread
* context ClassLoader already.
* @return the original thread context ClassLoader, or {@code null} if not overridden
*/
protected ClassLoader overrideThreadContextClassLoader() {
return ClassUtils.overrideThreadContextClassLoader(getBeanClassLoader());
}