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)
//将生成beanDefinitionName和beanDefinition放入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 {
//将生成beanDefinitionName和beanDefinition放入beanFactory
this.beanDefinitionNames.add(beanName);
this.beanDefinitionMap.put(beanName, beanDefinition);
}
}