Spring-IOC加载Bean【四】bean依赖信息处理与RootBeanDefinition
首先获取并检查RootBeanDefinition,之后再处理依赖bean。
1、获取RootBeanDefinition12345678910111213// 从容器中获取 beanName 相应的 GenericBeanDefinition,并将其转换为 RootBeanDefinitionfinal RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);//返回合并的RootBeanDefinition,如果指定的bean对应于子bean定义,则遍历父bean定义。protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException { // 首先快速检查map,使用最小的锁定。 RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName); if (mbd != ...
Spring-IOC加载Bean【三】parentBeanFactory与创建标记
继续分析Bean的加载:
1234567891011121314151617181920212223242526272829303132333435//假设我们在一个循环引用中,如果我们已经创建了这个bean实例,则会失败: if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // 获取父bean工厂,其用于bean继承支持。 BeanFactory parentBeanFactory = getParentBeanFactory(); // 检查这个工厂中是否存在bean定义。 if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { ...
Spring-IOC加载Bean【二】尝试获取单例对象实例
这一段代码是尝试从单例缓存中获取最原始的实例Bean,之后再通过getObjectForBeanInstance方法,获取我们需要的bean对象。
1234567891011121314151617// 检查单例缓存中手动注册的单例。 Object sharedInstance = getSingleton(beanName); //单例缓存中存在这个bean if (sharedInstance != null && args == null) { if (logger.isTraceEnabled()) { //指定的单例bean当前是否正在创建(在整个工厂内)。 if (isSingletonCurrentlyInCreation(beanName)) { logger.trace("Returning eagerly cached instance of singleton bean ...
Spring-IOC加载Bean【一】主要流程分析
经过IOC的初始化后,定义的Bean信息已经存储到了系统中,但是真正的Bean还没有被加载,通过显式的调用BeanFactory接口中的 getBean方法,才真正的加载并返回可以使用的Bean。
12345678910//资源定位ClassPathResource resource = new ClassPathResource("bean.xml");//bean工厂DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//xml BeanDefinition 阅读器XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);//加载与注册BeanDefinition,完成后的BeanDefinition放置在IOC容器中。reader.loadBeanDefinitions(resource);//bean的加载Object bean = factory.getBean("xxx&quo ...
Spring-IOC初始化【六】总结
经过上几篇文章的分析,已经将IOC初始化分析完了,在此做一个总结。依然搬出一段代码:
12345678//资源定位ClassPathResource resource = new ClassPathResource("bean.xml");//bean工厂DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//xml BeanDefinition 阅读器XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);//加载与注册BeanDefinition,完成后的BeanDefinition放置在IOC容器中。reader.loadBeanDefinitions(resource);
这段代码描述了IOC初始化的流程:
Resource的定位与加载
BeanDefinition的载入解析
BeanDefinition的注册
1、Resource定位与加载Spring 为了解决资源定位的问题,提供 ...
Spring-IOC初始化【五】自定义标签解析
delegate.parseCustomElement(ele)自定义解析这块解析实在是看不进去了,参考:【死磕 Spring】—– IOC 之解析自定义标签
这篇文章主要介绍了自定义标签的使用,还有解析,写的很不错,记录一下。Dubbo做到了直接通过spring来管理远程的bean,用的就是自定义标签解析: DubboBeanDefinitionParser ,其实现了BeanDefinitionParser接口,registerBeanDefinitionParser(“reference”, new DubboBeanDefinitionParser(ReferenceBean.class, false));
Spring-IOC初始化【四】默认标签解析与BeanDefinition的注册
1、parseDefaultElement(ele, delegate)使用默认命名空间的解析包括四种标签的解析:
12345678910111213141516171819202122private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { //"import" if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) { //解析一个“import”元素,并将bean定义从给定资源加载到bean工厂。 importBeanDefinitionResource(ele); } //"alias" else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) { //处理给定的别名元素,向 ...
Spring-IOC初始化【三】loadBeanDefinitions主流程分析
1、loadBeanDefinitions(Resource resource)从指定的XML文件加载bean定义。
12345678910/** * 从指定的XML文件加载bean定义。 * @param resource XML文件的资源描述符 * @return 找到的bean定义的数量 * @throws BeanDefinitionStoreException 在加载或解析错误的情况下抛出 */ @Override public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException { return loadBeanDefinitions(new EncodedResource(resource)); }
首先将Resource包装成EncodeResource:将Resource描述符与用于从资源中读取的特定编码组合在一起,之后调用loadBeanDefinitions(EncodedResource encodedResource)。
1 ...
Spring-IOC初始化【二】BeanDefinition的装载与注册总览
引言BeanDefinition描述了一个bean实例,它具有属性值、构造函数参数值和由具体实现提供的进一步信息。用来抽象和描述一个具体bean对象。是描述一个bean对象的基本数据结构。IOC容器中维护着一个BeanDefinition的Map,BeanDefinitionReader读取、解析Resource资源,并将产生的BeanDefinition注册到IOC中,根据配置的lazyinit属性,确定是否在容器初始化的时候进行依赖注入。
12345678//资源定位ClassPathResource resource = new ClassPathResource("bean.xml");//bean工厂DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//xml BeanDefinition 阅读器XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);//加载与注册BeanDefini ...
Spring-IOC初始化【一】统一资源加载策略
1、资源表示spring中通过org.springframework.core.io.Resource作为所有资源的抽象与访问接口。
123456789101112131415161718192021222324252627282930public interface Resource extends InputStreamSource { //资源是否存在 boolean exists(); //资源是否可读 default boolean isReadable() {return exists();} //资源是否被打开 default boolean isOpen() {return false;} //是否为文件 default boolean isFile() {return false;} //返回资源的URL句柄 URL getURL() throws IOException; //返回资源的URI句柄 URI getURI() throws IOException; ...