在 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/