Spring源码分析(一)

在进行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的类的层次图。

 

Spring源码分析(一)_第1张图片

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 getBeansOfType(Class type):返回某一种类型的bean。Key为beanName,T为bean

         getBeanNamesForAnnotation(Class annotationType):根据注解获取实现了该注解的所有的bean的名称

         Map getBeansWithAnnotation(Class annotationType):获取包含某一个注解的所有bean的map。Key为beanName

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方法。该方法就是一个典型的模板模式的设计。后面会说到这个类。

 

你可能感兴趣的:(Spring源码解读)