- spring中以er结尾的接口提供的都是getXXX()方法,或者是set方法,或publish方法
- spring中以Capable(再生/有…的能力)结尾的接口提供的也是getXXX()方法,有XXX的能力
- spring中doXXX()方法都是实际干事情的方法
AnnotationConfigApplicationContext继承图
顶
级
接
口
\color{red}{顶级接口}
顶级接口
-
BeanFactory有getBean() 可获得bean
-
HierarchicalBeanFactory有getParentBeanFactory() ,具有层次结构的bean工厂接口,可获得父(上一级的 )BeanFactory,也可在configurablebanfactory接口中以配置的方式设置父级beanFactory
-
ListableBeanFactory:有getBeanDefinitionCount() 可统计被定义的bean
-
ApplicationEventPublisher有publishEvent() 通知所有注册的被匹配到的监听者lisener,关于这个spring应用的事件。 可发布spring应用事件
-
EnvironmentCapable环境再生/胜任有 getEnvironment(); 可获得Environment对象
-
MessageSource是用来获得消息的,通过getMessage()方法
-
ResourceLoader它可以可获得类加载器或资源类(即输入流/Resource有getFile()获取文件的方法)
ProtocolResolver 可对协议进行解析或解析自定义的协议
- ResourcePatternResolver它是ResourceLoader的扩展,可对蚂蚁式的资源路径匹配模式进行解析【Ant-style蚂蚁式路径匹配就是规定了常用的3种路径匹配规则 ,?,* 匹配任何单字符/匹配0或者任意数量的字符/匹配0或者更多的目录】 可用于任何类型的位置模式(例如“/WEB-INF/-context.xml”),建议一个新的资源加上前缀“class path:”,还可以根据路径得到Resource[]数组。即对应多个配置文件,这就是把外存的配置文件加载读入解析到内存中
Enviroment根据文件路径,或者包路径,得到配置文件或配置类的信息,并且可以解析文件中的属性
- java.lang.AutoCloseable一个对象,它可以保存资源(如文件或套接字句柄)直到它被关闭。自动退出对象的关闭()方法在退出具有资源块的尝试时被自动调用,资源块已经在资源规范标题中声明了该对象。这种结构确保了及时发布,避免了资源耗尽异常和可能发生的错误。基类实现autocloseable是可能的,而且事实上是常见的,即使不是所有的子类或实例都包含可发布的资源。对于必须在完全通用性下运行的代码,或者当知道自动关闭实例需要释放资源时,建议对资源构造使用try。但是,当使用支持基于I/O和非基于I/O的表单的流等工具时,使用非基于I/O的表单时通常不需要try with resources块。
- DefaultResourceLoader 它是resourceloader接口的默认实现。由资源编辑器使用,并用作AbstractApplicationContext的基类。也可以单独使用。
如果location值是URL,则返回UrlResource;如果是非URL路径或“classpath:”伪URL,则返回ClassPathResource。 - AliasRegistry注册bean的别名,删除别名,获取别名。【registerAlias,getAliases…】encapsulates
二 级 接 口 \color{red}{二级接口} 二级接口
- Lifecycle生命周期的控制处理是异步的,容器将开始/停止信号传播到每个容器中应用的所有组件中,例如在运行时停止/重启的信号。【里面提供了开始,停止,正在运行的的方法】
- ApplicationContext由于继承了1,2,3,4,5,6,7,8.,所以它获得了getBean,getMessage,getEnvironment(),pulishEvent()等功能,同时它自身还扩展了getAutowireCapableBeanFactory()方法,你可以通过该方法拿到这个有着自动注入能力的beanFactory类
- ConfigurableApplicationContext可配置的ApplicationContext,可向应用环境中添加自定义的应用监听器,后置处理器,设置ApplicationContext的父级,设置环境(切换应用的配置文件)【addApplicationListener,addBeanFactoryPostProcessor,refresh,setEnvironment】
- BeanDefinitionRegistry他继承自AliasRegistry,除了可对bean别名进行crud,还可以对BeanDefinition进行crud
- AbstractApplicationContext它里面有List < BeanFactoryPostProcessor > beanFactoryPostProcessors即容纳bean工厂的后置处理器的列表容器,该类可以自动注册在上下文中被定义为bean的beanfactorypostprocessors、beanpstprocessors和applicationlisteners。它使用了模板方法设计模式,需要具体的子类来实现抽象方法。
- GenericApplicationContext实现了一个单一的内部定义工厂实例(new beanFactory),而不承担一个特定的bean格式定义。
-
实现BeanDefinitionRegistry接口,以便允许对其使用任何bean定义读取器
-
它典型的用法是:通过BeanDefinitionRegistry接口来注册一系列的beanDefinitions,(即添加bean)然后调用AbstractApplicationContext.refresh()去初始化那些bean,该方法只能调用一次
-
它与其他 ApplicationContext的实现类不同的是:他的每次刷新refresh()调用,都会new一个内部BeanFactory实例,这个实例你可以从一开始就得到,以便注册到beanDefinations里面
-
xml使用例子如下
-
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
ctx.refresh();
MyBean myBean = (MyBean) ctx.getBean("myBean");
//.........
构造方法如下:
public GenericApplicationContext() {
//new了一个beanfactory的实例
this.beanFactory = new DefaultListableBeanFactory();
}
最
终
实
现
类
A
n
n
o
t
a
t
i
o
n
C
o
n
f
i
g
A
p
p
l
i
c
a
t
i
o
n
C
o
n
t
e
x
t
\color{red}{最终实现类AnnotationConfigApplicationContext}
最终实现类AnnotationConfigApplicationContext
AnnotationConfigApplicationContext
- 作为独立的应用环境,它接受注解类作为输入,尤其是@Configuration和@Component注解
- 如果有多个@Configuration注解类,后定义地@bean方法将会覆盖之前的类方法
- 我们可以利用这点,慎重地通过一个额外的类来重写确定地bean定义
AutowireCapableBeanFactory它可以创建bean,自动注入bean,初始化bean,配置bean,解决bean依赖,bean名称,申请后置处理器对bean进行初始化前处理,初始化处理,销毁bean【createBean,autowireBean,configureBean,createBean,initializeBean,applyBeanPostProcessorsBeforeInitialization,applyBeanPostProcessorsAfterInitialization,destroyBean,resolveNamedBean,resolveDependency】-----------这是一个重点类
BeanDefinition可以【setBeanClassName,getBeanClassName,setScope,setLazyInit,setDependsOn,setPrimary,setFactoryBeanName,getPropertyValues,isSingleton,setParentName】,他继承了AttributeAccessor(属性访问器), BeanMetadataElement(bean元数据元素,里面的getSource()是拿到bean上注解的信息)
AbstractBeanDefinition提供了对bean定义的属性值的一系列getXXX,setXXX,isXXX方法,并做出了实现
- StandardEnviroment这是可以直接new一下的,可以配置属性解析和与配置文件相关的操作)
- AbstractEnvironment这是spring应用一启动时,里面的成员变量【Set activeProfiles激活的配置文件,Set defaultProfiles默认的配置文件,MutablePropertySources可变的属性资源(它是一个装PropertySource的迭代器),ConfigurablePropertyResolver可【可配置的属性解析器】就会被实例化
- MutablePropertySources—>PropertySources---->Iterable<PropertySource<?>>
- PropertySource是什么:
public abstract class PropertySource<T> { protected final Log logger = LogFactory.getLog(getClass()); protected final String name; protected final T source; }