說明
今天在閱讀Spring源碼的時候孕荠,發(fā)現(xiàn)在加載xml中的bean時痹升,解析了很多標簽,其中有常用的如:scope典蜕、autowire断盛、lazy-init、init-method愉舔、destroy-method等等钢猛。但還有很多很少用甚至沒用過的標簽,看來對這個經常使用的框架轩缤,還是知之甚少命迈,本著探索的精神,決定將bean中所有相關標簽的作用做一次整理火的,以便完善自己的知識體系壶愤。
另外,說明一下馏鹤,使用的Spring源碼版本為當前最新版本5.2.0.BUILD-SNAPSHOT征椒,跟老版本中的相關代碼可能會有少數(shù)差異。
Spring中對屬性標簽的解析
解析Spring中bean的屬性標簽的源碼位置位于類:BeanDefinitionParserDelegate 的 parseBeanDefinitionAttributes 方法中湃累,源碼如下:
public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,
@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) {
// 解析 singleton 屬性勃救,當前版本已不支持該屬性,如使用將會拋出異常
if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {
error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);
}
// 解析 scope 屬性
else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {
bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));
}
else if (containingBean != null) {
// 如果當前 bean 沒有設置 scope 屬性且當前 bean 是其他 bean 的內部 bean脱茉,則設置為其外部 bean 的 scope 屬性值
bd.setScope(containingBean.getScope());
}
// 解析 abstract 屬性
if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {
bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE)));
}
// 解析 lazy-init 屬性
String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE);
if (isDefaultValue(lazyInit)) {
lazyInit = this.defaults.getLazyInit();
}
bd.setLazyInit(TRUE_VALUE.equals(lazyInit));
// 解析 autowire 屬性
String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE);
bd.setAutowireMode(getAutowireMode(autowire));
// 解析 depends-on 屬性
if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);
bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
}
// 解析 autowire-candidate 屬性
String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
if (isDefaultValue(autowireCandidate)) {
String candidatePattern = this.defaults.getAutowireCandidates();
if (candidatePattern != null) {
String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
}
}
else {
bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
}
// 解析 primary 屬性
if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {
bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE)));
}
// 解析 init-method 屬性
if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);
bd.setInitMethodName(initMethodName);
}
else if (this.defaults.getInitMethod() != null) {
// 如果沒有設置該屬性剪芥,則設置為默認值
bd.setInitMethodName(this.defaults.getInitMethod());
bd.setEnforceInitMethod(false);
}
// 解析 destroy-method 屬性
if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {
String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);
bd.setDestroyMethodName(destroyMethodName);
}
else if (this.defaults.getDestroyMethod() != null) {
bd.setDestroyMethodName(this.defaults.getDestroyMethod());
bd.setEnforceDestroyMethod(false);
}
// 解析 factory-method 屬性
if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));
}
// 解析 factory-bean 屬性
if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));
}
return bd;
}
里面可以看到對 bean 標簽中的很多屬性進行了解析,接下來的幾篇里琴许,就來看看每個屬性的作用税肪。(第一個已經廢棄的屬性就不說了?)
我做開發(fā)十多年的時間,如果大家對于學習java的學習方法,學習路線以及你不知道自己應該是自學還是培訓的疑問益兄,都可以隨時來問我锻梳,大家可以加我的java交流學習qun:四九四,八零一净捅,九三一疑枯,qun內有學習教程以及開發(fā)工具。