java - 获取Spring bean依赖@Runtime

标签 java spring

在 Spring 应用程序中,我想在运行时获取给定 bean 的对象图结构以及依赖项(包括嵌套)列表。

例如:

public class College {
   private List<Student>
   private List<Staff>
   private List<Department>

  setter Methods....
}

public class Student {
  private List<Subject>;
  private Address;    

 setter Methods....
}

假设:
* 全部通过 Spring 注入(inject)和连接。
* 想要利用 spring 中的任何 API(从而避免反射)

目标:
* 通过UI向用户显示依赖信息。实现这一点的其他方法是在应用程序外部维护一个重复的副本(如数据库、非 spring bean xml),这当然是不好的,因此要避免

最佳答案

您可以在上下文启动时使用 ReaderEventListener 构建对象 grahp。

例如:

public class TrackingReaderEventListener extends EmptyReaderEventListener {

    private Map<String, ComponentDefinition> components = new HashMap<String, ComponentDefinition>();

    @Override
    public void componentRegistered(ComponentDefinition componentDefinition) {
        components.put(componentDefinition.getName(), componentDefinition);
    }

    public Map<String, ComponentDefinition> getComponentMap() {
        return components;
    }

    public static void main (String[] args) {
        TrackingReaderEventListener listener = new TrackingReaderEventListener();
        ClassPathXmlApplicationContext context = new AppContext("applicationContext.xml", listener);
        context.refresh();   // or may be load beans definitions only
    }

}

class AppContext extends ClassPathXmlApplicationContext {

    private ReaderEventListener readerListener;

    public AppContext(String configLocation, ReaderEventListener readerListener) {
        super(new String[] {configLocation} , false);
        this.readerListener = readerListener;
    }

    @Override
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
        super.initBeanDefinitionReader(reader);
        reader.setEventListener(readerListener);
    }

}

或者直接从 BeanFactory 构建它们

DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)  context.getBeanFactory();
    String[] beanNames = beanFactory.getBeanDefinitionNames();
    for (String beanName : beanNames) {
        BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
        PropertyValues pvs = bd.getPropertyValues();
        String[]  dependsOn = bd.getDependsOn();
        ...
    }

关于java - 获取Spring bean依赖@Runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524216/

相关文章:

java - 如何在 Rest 中从 JSON 对象中单独获取数组

java - 无法获得正确的输出 xml 文件

javax.imageio.IIOException : I/O error writing PNG file 异常

java - 是否有用于 Spring/SpringMVC 的类似 Sprockets 的库/插件?

java - Spring Roo 更新密码字段或不更新所有字段

java - spring cloud stream rabbit 的退避设置

java - 每个模块(在多模块 Maven 项目中)是否应该有自己专用的异常?

java - 如何从 Jruby 调用 jar 函数?

java - 如何初始化 spring 集成 :gateway at startup?

Spring Autowire 失败,找不到类型的合格 bean 依赖错误