Spring核心架构
Spring大约有20个模块,由1300多个不同的文件构成
这些模块可以分为:
核心容器,AOP和设备支持,数据访问和集成,Web组件,通信报文和集成测试,下面是Spring框架的总体架构图:
核心容器由beans,core,context和expression(Spring Expression Language,SPEL)4个模块组成
要点一:
spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(IOC)和依赖注入(DI).
BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。
BeanFactory属于延时加载,也就是说在实例化容器对象后并不会自动实例化Bean,只有当Bean被使用时,BeanFatory才会对该Bean进行实例化与依赖关系的装配.
要点二:
spring-context模块架构与核心模块之上,扩展了BeanFactory,为它添加了Bean生命周期控制,框架事件体系及资源加载透明化等功能。
此外,此模块还提供了许多企业支持,如邮件访问,远程访问,任务调度。
ApplicationContext是该模块的核心接口,它的超类是BeanFactory.
要点三;
spring-context-support模块是对Spring IOC容器及IOC子容器的扩展支持
要点四:
spring-context-indexer模块是Spring的类管理组件和Classpath扫描组件
要点五:
spring-expression模块是统一表达式语言EL的扩展模块,可以查询,管理运行中的对象,同时也可以方便地调用对象方法,以及操作数组,集合等。
它的语法类似于传统EL,但提供了额外的功能,最出色的要数函数调用和简单的字符串模板函数。
EL的特性是基于Spring产品的需求而设计的,可以非常方便地同Spring IOC进行交互
Bean概述
Spring IOC相关接口分析
BeanFactory接口
这三个接口共同定义了Bean的集合,Bean之间的关系及Bean行为。
最基本的IOC容器接口是BeanFactory,来看一下它的源码
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
//根据Bean的名称,获取IOC容器中的Bean对象
Object getBean(String var1) throws BeansException;
//根据Bean的名称,获取IOC容器中的Bean对象,并指定获取到的Bean对象的类型,这样我们使用时,就不需要进行强制类型转换
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
//判断容器中是否包含指定名称的Bean
boolean containsBean(String var1);
//根据Bean的名称判断是否是单例
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
//是否是多实例Bean
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
BeanFactory里只对IOC容器的基本行为做了定义,根本不关心你的Bean是如何定义及加载的。
正如我们只关心能从工厂里得到什么产品,不关心工厂是怎么生产这些产品的。
BeanFactory有一个很重要的子接口,就是ApplicationContext接口,该接口主要来规范容器中的bean对象是非延时加载的,即在创建容器对象的时候就对Bean进行初始化,并存储到一个容器中
要知道工厂是如何产生对象的,我们需要看具体的IOC容器实现,Spring提供了许多IOC容器实现,比如:
ClasspathXmlApplicationContext :根据类路径加载xml配置文件,并创建IOC容器对象
FileSystemXmlApplicationContext:根据系统路径加载xml配置文件,并创建IOC容器对象
AnnotationConfigApplicationContext:加载注解类配置,并创建IOC容器
BeanDefinition接口
Spring IOC容器管理我们定义的各种Bean对象及其相互关系,而Bean对象在Spring实现中是以BeanDefinition来描述的,如下面的配置文件
<bean id="userDao" class="com.dao.impl.UserDaoImpl"></bean>
bean标签还有很多属性: scope,init-method,destory-method等
BeanDefinitionReader接口定义的功能:
public interface BeanDefinitionReader {
//获取BeanDefinitionRegistry 注册器对象
BeanDefinitionRegistry getRegistry();
@Nullable
ResourceLoader getResourceLoader();
@Nullable
ClassLoader getBeanClassLoader();
BeanNameGenerator getBeanNameGenerator();
//下面的loadBeanDefinitions都是从指定的资源中加载bean定义信息
int loadBeanDefinitions(Resource var1) throws BeanDefinitionStoreException;
int loadBeanDefinitions(Resource... var1) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String var1) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String... var1) throws BeanDefinitionStoreException;
}
后续可能也会继续补充
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。