package com.yourpackage;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.SmartLifecycle;
public class SpringVisualizer implements ApplicationContextAware, SmartLifecycle {
private ConfigurableApplicationContext context;
private boolean isRunning = false;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.context = (ConfigurableApplicationContext) applicationContext;
}
@Override
public void start() {
System.out.println("\n\n=== QUANTUM SPRING BEAN VISUALIZER STARTING ===");
try {
generateDotGraph();
} catch (Exception e) {
System.err.println("Failed to generate graph: " + e.getMessage());
}
this.isRunning = true;
}
private void generateDotGraph() {
ConfigurableListableBeanFactory factory = context.getBeanFactory();
StringBuilder dot = new StringBuilder();
dot.append("digraph SpringDependencyGraph {\n");
dot.append(" rankdir=LR;\n"); // Left to Right flow for better readability
dot.append(" node [shape=rectangle, style=filled, color=lightblue, fontname=\"Verdana\", fontsize=10];\n");
dot.append(" edge [color=gray, arrowsize=0.5];\n\n");
String[] allBeans = factory.getBeanDefinitionNames();
for (String beanName : allBeans) {
// Get all beans that the current bean depends on
String[] dependencies = factory.getDependenciesForBean(beanName);
for (String dep : dependencies) {
// Formatting: "SourceBean" -> "TargetBean"
dot.append(String.format(" \"%s\" -> \"%s\";\n", beanName, dep));
}
// Optional: Highlight COMET or CPLS beans specifically
if (beanName.toLowerCase().contains("comet") || beanName.toLowerCase().contains("cpls")) {
dot.append(String.format(" \"%s\" [color=orange];\n", beanName));
}
}
dot.append("\n}\n");
System.out.println("----- COPY START (Paste into Edotor.net) -----");
System.out.println(dot.toString());
System.out.println("----- COPY END -----");
}
@Override
public int getPhase() {
// Integer.MAX_VALUE ensures this starts AFTER all other lifecycle beans
return Integer.MAX_VALUE;
}
@Override
public boolean isAutoStartup() { return true; }
@Override
public void stop() { this.isRunning = false; }
@Override
public boolean isRunning() { return this.isRunning; }
@Override
public void stop(Runnable callback) {
stop();
callback.run();
}
}
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)