这一篇主要是讲用载入bean的过程。其实就是IOC.低调 低调。。
我把重要的都挑出来了。一步步往下看就明白spring载入bean.xml里面bean的原理 。
感觉像候杰的 MFC深入浅出,哈哈。
观看规则
接下 表示下一层代码。
接上 表示最近上面要调用的代码的详细部分。
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}
public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
public int loadBeanDefinitions(Resource resource) throws BeansException {
InputStream is = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(this.validating);
DocumentBuilder docBuilder = factory.newDocumentBuilder();
docBuilder.setErrorHandler(this.errorHandler);
if (this.entityResolver != null) {
docBuilder.setEntityResolver(this.entityResolver);
}
is = resource.getInputStream();
Document doc = docBuilder.parse(is);
return registerBeanDefinitions(doc, resource);
}
public int registerBeanDefinitions(Document doc, Resource resource) throws BeansException {
XmlBeanDefinitionParser parser = (XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass);
return parser.registerBeanDefinitions(this, doc, resource);
}
}
public class DefaultXmlBeanDefinitionParser implements XmlBeanDefinitionParser {
public static final String AUTOWIRE_BY_NAME_VALUE = "byName";
public static final String AUTOWIRE_BY_TYPE_VALUE = "byType";
public static final String DEFAULT_LAZY_INIT_ATTRIBUTE = "default-lazy-init";
public static final String DEFAULT_DEPENDENCY_CHECK_ATTRIBUTE = "default-dependency-check";
public static final String DEFAULT_AUTOWIRE_ATTRIBUTE = "default-autowire";
public static final String NAME_ATTRIBUTE = "name";
public static final String ALIAS_ATTRIBUTE = "alias";
public static final String BEAN_ELEMENT = "bean";
public static final String ID_ATTRIBUTE = "id";
public static final String PARENT_ATTRIBUTE = "parent";
public static final String CLASS_ATTRIBUTE = "class";
public static final String SINGLETON_ATTRIBUTE = "singleton";
public static final String LAZY_INIT_ATTRIBUTE = "lazy-init";
public static final String AUTOWIRE_ATTRIBUTE = "autowire";
public int registerBeanDefinitions(BeanDefinitionReader reader, Document doc, Resource resource) throws BeanDefinitionStoreException {
this.beanDefinitionReader = reader;
this.resource = resource;;
Element root = doc.getDocumentElement();
int beanDefinitionCount = parseBeanDefinitions(root);
return beanDefinitionCount;
}
protected int parseBeanDefinitions(Element root) throws BeanDefinitionStoreException {
NodeList nl = root.getChildNodes();
int beanDefinitionCounter = 0;
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
if
else if (BEAN_ELEMENT.equals(node.getNodeName())) {
beanDefinitionCounter++;
BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele);
BeanDefinitionReaderUtils.registerBeanDefinition(
bdHolder, this.beanDefinitionReader.getBeanFactory());
}
}
}
return beanDefinitionCounter;
}
protected BeanDefinitionHolder parseBeanDefinitionElement(Element ele) throws BeanDefinitionStoreException {
BeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName);
return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
}
protected BeanDefinition parseBeanDefinitionElement(Element ele, String beanName) throws BeanDefinitionStoreException {
try {
MutablePropertyValues pvs = parsePropertyElements(ele, beanName);
AbstractBeanDefinition bd = BeanDefinitionReaderUtils.createBeanDefinition(
className, parent, cargs, pvs, this.beanDefinitionReader.getBeanClassLoader());
return bd;
}
catch (
}
}
}
public class BeanDefinitionReaderUtils {
public static void registerBeanDefinition(
BeanDefinitionHolder bdHolder, BeanDefinitionRegistry beanFactory) throws BeansException {
beanFactory.registerBeanDefinition(bdHolder.getBeanName(), bdHolder.getBeanDefinition());
}
}
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry {
private boolean allowBeanDefinitionOverriding = true;
private final Map beanDefinitionMap = new HashMap();
private final List beanDefinitionNames = new ArrayList();
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {
Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
if (oldBeanDefinition != null) {
if (!this.allowBeanDefinitionOverriding) {
throw new BeanDefinitionStoreException(...);
}
else {
}
}
else {
this.beanDefinitionNames.add(beanName);
}
this.beanDefinitionMap.put(beanName, beanDefinition);
}
}
可以看到其实spring就是把bean.xml解析到一个map里。
转载路径:http://hzieept.iteye.com/blog/748283