DEV Community

Query Filter
Query Filter

Posted on

bridge78

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();
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)