2013-07-08 48 views
1

在一個Spring應用程序中,我想獲取給定Bean的對象圖結構以及依賴項列表(包括嵌套)。在運行時獲取Spring bean依賴關係@ Runtime

E.g:

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

    setter Methods.... 
} 

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

setter Methods.... 
} 

假設:
*所有注入&通過彈簧接線。
*想利用彈簧內的任何API(以及因此避免反射)

目標:
*顯示通過UI給用戶的相關性信息。實現這一目的的其他方法是在應用程序之外(如db,non-spring bean xml)維護一個重複的副本,因爲這是錯誤的,因此可以避免

+1

建立他們,你可以告訴更多一點關於你正試圖在這裏完成什麼? 「對象圖結構」是什麼意思? –

+0

您可以看看[反射框架](http://docs.oracle.com/javase/tutorial/reflect/) –

+0

Hi @ErikPragt,按對象結構我的意思是Spring對象創建的bean對象與其存在於內存中的依賴關係。在上面的例子中,存在於內存中的** College **對象的整個對象結構。 – Jaga

回答

3

您可以使用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(); 
     ... 
    }