天天看點

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

ClassPathXmlApplicationContext的獲得方式:ClassPathXmlApplicationContext context =

new ClassPathXmlApplicationContext(“Beans.xml”);

重要的成員變量:

beanFactory: DefaultListableBeanFactory

beanFactoryPostProcessors: ArrayList

classLoader: sun.misc.Launcher$AppClassLoader@14dad5dc

configLocations: Beans.xml

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

  • Logger: Jdk14Logger
    Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

使用方法containsBean:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

delegate給getBeanFactory().containsBean方法:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

這個containsBean方法定義在AbstractApplicationContext裡:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?
Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

而getBeanFactory的實作,位于AbstractRefreshableApplicationContext裡:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

DefaultListableBeanFactory裡有個成員變量beanDefinitionMap, 是一個ConcurrentHashMap:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?

我在Beans.xml裡定義的bean就存儲在這個hashmap裡,是以最後context.containsBean傳回true:

Java Spring ClassPathXmlApplicationContext是如何判斷容器内包含某個Bean的如何判斷ClassPathXmlApplicationContext容器裡是否包含某bean?