现在的位置: 首页 > 综合 > 正文

Inside-springframework-bean-definition

2013年10月08日 ⁄ 综合 ⁄ 共 8151字 ⁄ 字号 评论关闭
 

Inside-springframework-bean-definition

 

说明:BeanDefinition的生成原理和过程,阅读源程序的一些笔记,已备以后回顾。

过程:1)遍历所有的Spring配置文件(ApplicationContext*.xmlm)。

      2)将每个bean节点的内容包装为一个BeanDefinition对象。

      3)将包装好的BeanDefinition对象和beanName存入beanFactory中。

☆ 起势

public abstract class AbstractApplicationContext extends DefaultResourceLoader

        implements ConfigurableApplicationContext, DisposableBean {

 

        public void refresh() throws BeansException, IllegalStateException {

        synchronized (this.startupShutdownMonitor) {

            refreshBeanFactory(); (1)

    }

}

 

      public abstract class AbstractRefreshableApplicationContext

extends AbstractApplicationContext {

    protected final void refreshBeanFactory() throws BeansException {

        //源起

        DefaultListableBeanFactory beanFactory = createBeanFactory(); (2)

        //模版模式,调用子类XmlWebApplicationContext同名方法

        loadBeanDefinitions(beanFactory); (3)

}

 

protected DefaultListableBeanFactory createBeanFactory() {

    return new DefaultListableBeanFactory(getInternalParentBeanFactory());(2)

}

}

 

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {

    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)

throws IOException {(3)

        XmlBeanDefinitionReader beanDefinitionReader = new

XmlBeanDefinitionReader(beanFactory); (4)

 

        loadBeanDefinitions(beanDefinitionReader);)(5)

    }

 

    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) (5)

throws BeansException, IOException {

        String[] configLocations = getConfigLocations();

        if (configLocations != null) {

            for (int i = 0; i < configLocations.length; i++) {

                /**

/*configLocations[i]=

/WEB-INF/applicationContext-dudu.xml

**/

                reader.loadBeanDefinitions(configLocations[i]);(6)

            }

        }

    }

}

 

(6注:委派)

public abstract class AbstractBeanDefinitionReader implements BeanDefinitionReader {

    public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {

        int loadCount = loadBeanDefinitions(resources);(7)

    }

}

 

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {(8)

    public int loadBeanDefinitions(EncodedResource encodedResource) throws

BeanDefinitionStoreException {

        InputStream inputStream = encodedResource.getResource().getInputStream(); (9)

   

        return doLoadBeanDefinitions(inputSource, encodedResource.getResource());(10)

    }

 

    protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)(10)

            throws BeanDefinitionStoreException {

            //读取xml配置文件中的内容

            Document doc = this.documentLoader.loadDocument(

                    inputSource, this.entityResolver, this.errorHandler, validationMode,

this.namespaceAware);

            return registerBeanDefinitions(doc, resource);(11)

    }

 

    (11)

public int registerBeanDefinitions(Document doc, Resource resource) throws

BeanDefinitionStoreException {

//实际的类是DefaultBeanDefinitionDocumentReader

        BeanDefinitionDocumentReader documentReader =

createBeanDefinitionDocumentReader();

 

        documentReader.registerBeanDefinitions(doc, createReaderContext(resource));(12)

    }

}

 

public class ServletContextResource extends AbstractResource {

        public InputStream getInputStream() throws IOException {

        InputStream is = this.servletContext.getResourceAsStream(this.path); (9)

        return is;

    }

}

 

 

 

      public class DefaultBeanDefinitionDocumentReader

implements BeanDefinitionDocumentReader {

12注)

    public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {

 

        /**

        *生成委派对象delegate,并生成默认bean对象DocumentDefaultsDefinition

        *存入其中

        **/

        BeanDefinitionParserDelegate delegate = createHelper(readerContext, root);(13)

 

        parseBeanDefinitions(root, delegate);(14)

    }

 

    (13)

    protected BeanDefinitionParserDelegate createHelper(XmlReaderContext readerContext,

Element root) {

        delegate.initDefaults(root); 14

    }

 

    //中间不重要处跳过

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {

    parseDefaultElement(ele, delegate); (15)

}

 

15注)

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {

    processBeanDefinition(ele, delegate); (16)

}

 

16注)

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {

    //这是最后生成的beanDefinition的包装对象,具体生成过程在步骤18

    BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); 17

 

    //将生成beanDefinitionNamebeanDefinition放入beanFactory

    // getReaderContext().getRegistry()得到的是beanFactory对象

BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder,

getReaderContext().getRegistry());(16)

}

}

 

      public class BeanDefinitionParserDelegate {

(14注:beanDefinition初时值对象)

    public void initDefaults(Element root) {

        DocumentDefaultsDefinition defaults = new DocumentDefaultsDefinition();

        defaults.setLazyInit(root.getAttribute(DEFAULT_LAZY_INIT_ATTRIBUTE));

        defaults.setAutowire(root.getAttribute(DEFAULT_AUTOWIRE_ATTRIBUTE));

        defaults.setDependencyCheck(root.getAttribute(DEFAULT_DEPENDENCY_CHECK_ATT

RIBUTE));

        if (root.hasAttribute(DEFAULT_INIT_METHOD_ATTRIBUTE)) {

            defaults.setInitMethod(root.getAttribute(DEFAULT_INIT_METHOD_ATTRIBUTE));

        }

        if (root.hasAttribute(DEFAULT_DESTROY_METHOD_ATTRIBUTE)) {

            defaults.setDestroyMethod(root.getAttribute(DEFAULT_DESTROY_METHOD_ATTRIBUTE));

        }

        defaults.setMerge(root.getAttribute(DEFAULT_MERGE_ATTRIBUTE));

        defaults.setSource(this.readerContext.extractSource(root));

 

        this.defaults = defaults;

        this.readerContext.fireDefaultsRegistered(defaults);

    }

 

    17注)

public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition

containingBean) {

//example:id = dataSource

        String id = ele.getAttribute(ID_ATTRIBUTE);

   

        //经过这一步后beanDefinition对象生成赋值完毕(19

AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName,

containingBean); (18)

 

        //返回beanDefinition对象的包装类

        return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);

    }

 

    19注)

    public AbstractBeanDefinition parseBeanDefinitionElement(

            Element ele, String beanName, BeanDefinition containingBean) {

//example: className= //org.apache.commons.dbcp.BasicDataSource

        className = ele.getAttribute(CLASS_ATTRIBUTE);

        this.parseState.push(new BeanEntry(beanName));

       

        AbstractBeanDefinition bd = BeanDefinitionReaderUtils.createBeanDefinition(

                    parent, className, this.readerContext.

getReader().getBeanClassLoader()); (20)

 

        //以下步骤为BeanDefinition对象赋值

        bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));

        //如果条件不符合,就将DocumentDefaultsDefinition

//对象的属性赋值给BeanDefinition对象

        lazyInit = this.defaults.getLazyInit();

        bd.setLazyInit(TRUE_VALUE.equals(lazyInit));

        bd.setAutowireMode(getAutowireMode(autowire));

        bd.setDependencyCheck(getDependencyCheck(dependencyCheck));

        … …

        //bean的属性值赋给BeanDefinitioin对象

        parsePropertyElements(ele, bd); (21)

 

        return bd;

    }

public void parsePropertyElement(Element ele, BeanDefinition bd) { (21)

    //sample: propertyName =driverClassName

    String propertyName = ele.getAttribute(NAME_ATTRIBUTE);

    this.parseState.push(new PropertyEntry(propertyName));

    //sample: val = com.mysql.jdbc.Driver,取出bean属性中的value并包装为对象   

    Object val = parsePropertyValue(ele, bd, propertyName); (22)

    PropertyValue pv = new PropertyValue(propertyName, val);

    //将生成propertyValue对象赋值给BeanDefinition

    bd.getPropertyValues().addPropertyValue(pv);

}

}

 

      public class BeanDefinitionReaderUtils {

20注)

        public static AbstractBeanDefinition createBeanDefinition(

            String parent, String className, ClassLoader classLoader) throws

ClassNotFoundException {

            bd = new RootBeanDefinition();

            bd.setBeanClassName(className);

 

            return bd;

    }

        (16)

        public static void registerBeanDefinition(

            BeanDefinitionHolder bdHolder, BeanDefinitionRegistry beanFactory)

throws BeansException {

 

            23

            beanFactory.registerBeanDefinition(beanName, bdHolder.getBeanDefinition());

        }

}

 

(23)

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory

implements ConfigurableListableBeanFactory, BeanDefinitionRegistry {

    //将生成beanDefinitionNamebeanDefinition放入beanFactory

    this.beanDefinitionNames.add(beanName);

    this.beanDefinitionMap.put(beanName, beanDefinition);

}

}

 

 

 

抱歉!评论已关闭.