package com.example; import java.net.URLClassLoader; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.Vector; import org.junit.Test; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.retry.annotation.EnableRetry; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Component; import org.springframework.test.util.ReflectionTestUtils; public class ProxyApplicationTests { private Set<Class<?>> classes = new HashSet<>(); @Test public void contextLoads() { System.err.println(count()); runAndClose(); System.err.println(count()); runAndClose(); System.err.println(count()); runAndClose(); System.err.println(count()); runAndClose(); System.err.println(count()); } @SuppressWarnings("resource") private void runAndClose() { ConfigurableApplicationContext run = new AnnotationConfigApplicationContext(Empty.class); run.close(); while (run.getParent() != null) { ((ConfigurableApplicationContext) run.getParent()).close(); run = (ConfigurableApplicationContext) run.getParent(); } } private int count() { URLClassLoader classLoader = (URLClassLoader) getClass().getClassLoader(); @SuppressWarnings("unchecked") Vector<Class<?>> classes = (Vector<Class<?>>) ReflectionTestUtils .getField(classLoader, "classes"); Set<Class<?>> news = new HashSet<>(); for (Iterator<Class<?>> iterator = classes.iterator(); iterator.hasNext();) { Class<?> cls = (Class<?>) iterator.next(); if (!this.classes.contains(cls)) { news.add(cls); } } System.err.println(news); this.classes.addAll(classes); return classes.size(); } @Configuration @EnableRetry(proxyTargetClass = true) protected static class Empty { @Bean public Service service() { return new Service(); } } @Component static class Service { @Retryable public void handle() { System.err.println("Handling"); } } }