Spring源码深度解析(郝佳)-学习-元数据解析
首先,我们看看xml实现
<bean id="myTestBean" class="com.spring_101_200.test_101_110.test108_mytestbean.MyTestBean">
<meta key="testStr" value="aaaaaaaaaaa"/>
</bean>
再来看看java 代码
public class Test108 {
@Test
public void test() {
XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("spring_101_200/config_101_110/spring108_mytestbean.xml"));
MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
BeanDefinition beanDefinition = bf.getBeanDefinition("myTestBean");
Object a = beanDefinition.getAttribute("testStr");
System.out.println(a );
System.out.println(bean.getTestStr());
}
}
myTestBean 实现
public class MyTestBean {
private String testStr = "testStr";
public String getTestStr() { return testStr; }
public void setTestStr(String testStr) {
this.testStr = testStr;
}
}
最终打印输出
aaaaaaaaaaa
testStr
结果分析:
我们的MyTestBean中的testStr并没有被元数据设置的值给替换掉,而元数据的获取则需要从BeanDefinition中的getAttribute方法获取,
我们来看看Spring 源码
在源码中,我们看到了,在解析Meta元素的时候,获取了key ,value ,然后封装成BeanMetadataAttribute,调用 BeanMetadataAttributeAccessor 实例的addMetadataAttribute方法,最终保存到了AttributeAccessorSupport 的attributes 的map 中,key 是meta元素的key,值是BeanMetadataAttribute 本身 ,在 Test108 中的
中 事实是调用了 BeanMetadataAttributeAccessor这个实例的getAttribute方法,代码如下
@Override
public Object getAttribute(String name) {
BeanMetadataAttribute attribute = (BeanMetadataAttribute) super.getAttribute(name);
return (attribute != null ? attribute.getValue() : null);
}
先调用父类的getAttribute方法获取BeanMetadataAttribute ,然后再获取value的值进行返回。
那为什么beanDefinition.getAttribute 调用的是 BeanMetadataAttributeAccessor方法呢?我们来看一下继承关系
我们在打断点调试的时候,看到,在解析元素返回的是AbstractBeanDefinition,而AbstractBeanDefinition继承BeanMetadataAttributeAccessor类,所以,在调用getAttribute的时候,就调用了BeanMetadataAttributeAccessor的getAttribute方法了
那我们分析了元数据配置,存储,获取,那元数据在Spring中到底有什么用处呢?
目前我也没有发现使用元数据的地方,还侍后期发现再补了
本文的项目github地址是[https://github.com/quyixiao/spring_tiny/tree/master/src/main/java/com/spring_101_200/test_101_110/test108_mytestbean]
上一篇: 有效的括号(辅助栈)
下一篇: 用JSTL实现JSP应用程序快速开发