2

在 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 中利用任何 API(因此避免反射)

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

4

1 回答 1

3

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

例如:

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();
        ...
    }
于 2013-07-08T23:02:36.173 回答