概括的描述一下Spring注册流程
Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的代码可以先忽略掉,达到理解大体的架子及流程,避免第一次就陷入某个坑里出不来。第二遍针对某个流程更深入的、有针对性的去分析学习,当然遇到某个实在过不去的坎可以标记,后面再思考,毕竟是别人设计的,有些不是那么容易理解,可以使用google,次数多了,总会有收获!
概括的描述一下Spring背后的操作,解析applicationgContext.xml,将xml中定义的bean(如loginService和loginResource)解析成Spring内部的BeanDefinition,并以beanName(如loginService)为key,BeanDefinition(如loginService相应的BeanDefinition)为value存储到DefaultListableBeanFactory中的beanDefinitionMap(其实就是一个ConcurrentHashMap)中,同时将beanName存入beanDefinitionNames(List类型)中,然后遍历beanDefinitionNames中的beanName,进行bean的实例化并填充属性,在实例化的过程中,如果有依赖没有被实例化将先实例化其依赖,然后实例化本身,实例化完成后将实例存入单例bean的缓存中,当调用getBean方法时,到单例bean的缓存中查找,如果找到并经过转换后返回这个实例(如LoginResource的实例),之后就可以直接使用了。
上边提到在Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构,BeanDefinition的内部结构。直接看BeanDefinition源码
- public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
- /**
- * Scope identifier for the standard singleton scope: "singleton".
- * <p>Note that extended bean factories might support further scopes.
- */
- String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
- /**
- * Scope identifier for the standard prototype scope: "prototype".
- * <p>Note that extended bean factories might support further scopes.
- */
- String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
- /**
- * Role hint indicating that a {@code BeanDefinition} is a major part
- * of the application. Typically corresponds to a user-defined bean.
- */
- int ROLE_APPLICATION = 0;
- /**
- * Role hint indicating that a {@code BeanDefinition} is a supporting
- * part of some larger configuration, typically an outer
- * {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
- * {@code SUPPORT} beans are considered important enough to be aware
- * of when looking more closely at a particular
- * {@link org.springframework.beans.factory.parsing.ComponentDefinition},
- * but not when looking at the overall configuration of an application.
- */
- int ROLE_SUPPORT = 1;
- /**
- * Role hint indicating that a {@code BeanDefinition} is providing an
- * entirely background role and has no relevance to the end-user. This hint is
- * used when registering beans that are completely part of the internal workings
- * of a {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
- */
- int ROLE_INFRASTRUCTURE = 2;
- /**
- * Return the name of the parent definition of this bean definition, if any.
- */
- String getParentName();
- /**
- * Set the name of the parent definition of this bean definition, if any.
- */
- void setParentName(String parentName);
- /**
- * Return the current bean class name of this bean definition.
- * <p>Note that this does not have to be the actual class name used at runtime, in
- * case of a child definition overriding/inheriting the class name from its parent.
- * Hence, do <i>not</i> consider this to be the definitive bean type at runtime but
- * rather only use it for parsing purposes at the individual bean definition level.
- */
- String getBeanClassName();
- /**
- * Override the bean class name of this bean definition.
- * <p>The class name can be modified during bean factory post-processing,
- * typically replacing the original class name with a parsed variant of it.
- */
- void setBeanClassName(String beanClassName);
- /**
- * Return the factory bean name, if any.
- */
- String getFactoryBeanName();
- /**
- * Specify the factory bean to use, if any.
- */
- void setFactoryBeanName(String factoryBeanName);
- /**
- * Return a factory method, if any.
- */
- String getFactoryMethodName();
- /**
- * Specify a factory method, if any. This method will be invoked with
- * constructor arguments, or with no arguments if none are specified.
- * The method will be invoked on the specified factory bean, if any,
- * or otherwise as a static method on the local bean class.
- * @param factoryMethodName static factory method name,
- * or {@code null} if normal constructor creation should be used
- */
- void setFactoryMethodName(String factoryMethodName);
- /**
- * Return the name of the current target scope for this bean,
- * or {@code null} if not known yet.
- */
- String getScope();
- /**
- * Override the target scope of this bean, specifying a new scope name.
- */
- void setScope(String scope);
- /**
- * Return whether this bean should be lazily initialized, i.e. not
- * eagerly instantiated on startup. Only applicable to a singleton bean.
- */
- boolean isLazyInit();
- /**
- * Set whether this bean should be lazily initialized.
- * <p>If {@code false}, the bean will get instantiated on startup by bean
- * factories that perform eager initialization of singletons.
- */
- void setLazyInit(boolean lazyInit);
- /**
- * Return the bean names that this bean depends on.
- */
- String[] getDependsOn();
- /**
- * Set the names of the beans that this bean depends on being initialized.
- * The bean factory will guarantee that these beans get initialized first.
- */
- void setDependsOn(String... dependsOn);
- /**
- * Return whether this bean is a candidate for getting autowired into some other bean.
- */
- boolean isAutowireCandidate();
- /**
- * Set whether this bean is a candidate for getting autowired into some other bean.
- */
- void setAutowireCandidate(boolean autowireCandidate);
- /**
- * Return whether this bean is a primary autowire candidate.
- * If this value is true for exactly one bean among multiple
- * matching candidates, it will serve as a tie-breaker.
- */
- boolean isPrimary();
- /**
- * Set whether this bean is a primary autowire candidate.
- * <p>If this value is true for exactly one bean among multiple
- * matching candidates, it will serve as a tie-breaker.
- */
- void setPrimary(boolean primary);
- /**
- * Return the constructor argument values for this bean.
- * <p>The returned instance can be modified during bean factory post-processing.
- * @return the ConstructorArgumentValues object (never {@code null})
- */
- ConstructorArgumentValues getConstructorArgumentValues();
- /**
- * Return the property values to be applied to a new instance of the bean.
- * <p>The returned instance can be modified during bean factory post-processing.
- * @return the MutablePropertyValues object (never {@code null})
- */
- MutablePropertyValues getPropertyValues();
- /**
- * Return whether this a <b>Singleton</b>, with a single, shared instance
- * returned on all calls.
- */
- boolean isSingleton();
- /**
- * Return whether this a <b>Prototype</b>, with an independent instance
- * returned for each call.
- */
- boolean isPrototype();
- /**
- * Return whether this bean is "abstract", that is, not meant to be instantiated.
- */
- boolean isAbstract();
- /**
- * Get the role hint for this {@code BeanDefinition}. The role hint
- * provides the frameworks as well as tools with an indication of
- * the role and importance of a particular {@code BeanDefinition}.
- */
- int getRole();
- /**
- * Return a human-readable description of this bean definition.
- */
- String getDescription();
- /**
- * Return a description of the resource that this bean definition
- * came from (for the purpose of showing context in case of errors).
- */
- String getResourceDescription();
- /**
- * Return the originating BeanDefinition, or {@code null} if none.
- * Allows for retrieving the decorated bean definition, if any.
- * <p>Note that this method returns the immediate originator. Iterate through the
- * originator chain to find the original BeanDefinition as defined by the user.
- */
- BeanDefinition getOriginatingBeanDefinition();
- }
可以看到上面的很多属性和方法都很熟悉,例如类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后面对Bean的操作就直接对BeanDefinition进行,例如拿到这个BeanDefinition后,可以根据里面的类名、构造函数、构造函数参数,使用反射进行对象创建。BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。BeanDefinition继承了AttributeAccessor,说明它具有处理属性的能力;BeanDefinition继承了BeanMetadataElement,说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object。
概括的描述一下Spring注册流程的更多相关文章
- Spring(六)Spring执行流程
Spring MVC工作流程图 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherS ...
- Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程
SpringMVC 拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口中的三个方法,也可以 ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...
- 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文.(之前看小强也写过一篇,这里通过自身的分析完整的总结一下以下6种 ...
- sip 注册流程
基本注册流程示意图: 注册流程描述如下: 1. SIP代理向SIP服务器发送REGISTER请求: 2. SIP服务器向SIP代理发送响应401,并在响应的消息头WWW ...
- 微信小程序注册流程
响应公司号召,跟上时代潮流,接下来我将独自开发微信小程序,接下来我介绍下注册流程,后续会补上小程序开发心得. 注册流程 注册之前,需要使用一个邮箱,该邮箱作为登录小程序的账号,这个邮箱不能被微信开放平 ...
- wifi万能钥匙自媒体平台开放注册(付注册流程)
12月13日,有网友爆料,wifi万能钥匙自媒体开放注册,看来自媒体还没有达到饱和阶段,也印证了自媒体时代才刚刚到来.现在这个自媒体的时代,几乎大多互联网企业都开通了自己的自媒体,比较知名的像今日头条 ...
- 源程序版本管理软件和项目管理软件,Github注册流程
目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点: Microsoft TFS: 优点: tfs核心的,是对敏捷,msf,cmm ...
随机推荐
- Ubuntu下安装wine plsql
在电脑上安装了第二系统Ubuntu,但面临各种Linux不支持的开发软件也是束手无策.比如常用的Eclipse,PlSQl,Oracle,QQ等等,于是,上网查阅各种资料,最终的解决方案还是要依赖于w ...
- EOS Bios Boot Sequence
EOS version:v1.0.5 Date:2018-06-19 Host: Centos 7 Reference :https://github.com/EOSIO/eos/wiki/Tutor ...
- mycat学习日记:全局sequence
mycat分库分表的情况下,原生mysql的自增长主键无法满足主键全局唯一这个要求.看了MYCAT社区从零开始的一篇博客,加上自己的实践,大概总结一下. 目前mycat对于全局sequence主要提供 ...
- java exception "file not found or file not exist"
出现这种异常一般有两种原因,第一种就是文件真的不存在:第二种是权限问题,权限问题又分为文件本身的权限和包含它的文件夹的权限 比如 ~/aaa/bbb/ccc/ddd/eee.txt 只要 aaa , ...
- Ubuntu搭建WordPress-MySQL-Apache
目标 技术博客www.xifarm.com有5年时间了. 原来在虚拟机/VPS上搭建,不过都是Windows系统下的. 最近突发奇想,试试迁移到Linux的Unbuntu下.说干就干,抽空用了大约3天 ...
- Redis的数据类型(Strings、 hashes)
字符串(Strings)类型及操作 字符串是Redis值的最基础的类型,一个key对应一个value,Redis字符串是二进制安全的,这意味着一个Redis字符串可以包含任何种类的数据,例如一个JPE ...
- ABAP跳转屏幕
1.call transaction语句跳转屏幕 '. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. . 2.调用函数 CALL FUNCTION 'M ...
- 登录控制 BaseController
执行方法前 判断 sessin 登录信息 是否为空 ,空的话 返回 登录界面 并且给 LoginUser 赋值 public abstract class BaseController : Contr ...
- 常用css和js组件
1 . input框中插入图标 <div class="col-sm-12 col-xs-12 setLineHeight"> <div class=" ...
- easyui常用控件及参数说明
CSS类定义: div easyui-window window窗口样式 属性如下: 1) modal:是否生成模态窗口.tru ...