在进行spring调用获取bean的时候,我们经常通过如下方式获取到一个对应的bean
ApplicationContext applicationnContext = new ClassPathXmlApplicationContext("context.xml"); String []beanNames =((ClassPathXmlApplicationContext) applicationnContext).getBeanDefinitionNames(); for(String name:beanNames){ System.out.println(name); } |
无论通过注解(后面会讲到)还是通过xml配置的方式,首先都是对应的创建一个ApplicationContext。那么我们先看下ApplicationContext的类的层次图。
ListableBeanFactory
containsBeanDefinition(String beanName):根据名称查询是否工厂中包含该bean
getBeanDefinitionCount(): 工厂中定义的bean的个数
getBeanDefinitionNames():返回工厂中定义的bean的所有名字
getBeanNamesForType(Class> type):根据类型从定义的bean中或者FactoryBeans中返回该类型对应的bean名称(包括子类)
getBeanNamesForType(Class> type, boolean includeNonSingletons, boolean allowEagerInit):返回某一类型的bean,可以根据是否单列以及是否允许提前初始化bean进行筛选过滤
Map
getBeanNamesForAnnotation(Class extends Annotation> annotationType):根据注解获取实现了该注解的所有的bean的名称
Map
EnvironmentCapable
Environment getEnvironment():获取环境配置
HierarchicalBeanFactory
getParentBeanFactory():获取父类的beanFactory
containsLocalBean(String name):查看当前beanFactory是否包含某一个bean。
ApplicationEventPublisher
publishEvent(ApplicationEvent event):发布一个事件
ResourcePatternResolver
getResources(String locationPattern):根据路径获取资源
ApplicationContext采用聚合的方式。实现了以上的所有的接口。复写了其方法,但是最终调用还是委托给具体的实现类。他在内部会聚合这些接口的实现类。无论GenericApplicationContext还是AbstractRefreshableApplicationContext类都会在类中维护一个私有的DefaultListableBeanFactory类。而该类就是具体的实现类。而ApplicationContext只是进行了相关的聚合。
ConfigurableApplicationContext
addBeanFactoryPostProcessor(BeanFactoryPostProcessor var1):添加一个后置处理器
addApplicationListener(ApplicationListener> var1):添加一个事件监听器
无论采用new ClassPathXmlApplcation的方式还是采用new AnnotationConfigApplicationContext方式获取到spring上下文。都需要继承自AbstractApplicationContext这个类。这个抽象类实现了大部分的功能。针对一些差异性的功能,如xml方式需要扫描解析xml对bean进行注册。都通过设置抽象方法。让父类自己去实现。比如obtainFreshBeanFactory方法。该方法就是一个典型的模板模式的设计。后面会说到这个类。