欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring源码深度解析(郝佳)-学习-元数据解析

程序员文章站 2024-01-28 17:32:40
...

首先,我们看看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 源码
Spring源码深度解析(郝佳)-学习-元数据解析
在源码中,我们看到了,在解析Meta元素的时候,获取了key ,value ,然后封装成BeanMetadataAttribute,调用 BeanMetadataAttributeAccessor 实例的addMetadataAttribute方法,最终保存到了AttributeAccessorSupport 的attributes 的map 中,key 是meta元素的key,值是BeanMetadataAttribute 本身 ,在 Test108 中的
Spring源码深度解析(郝佳)-学习-元数据解析

中 事实是调用了 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方法呢?我们来看一下继承关系
Spring源码深度解析(郝佳)-学习-元数据解析
我们在打断点调试的时候,看到,在解析元素返回的是AbstractBeanDefinition,而AbstractBeanDefinition继承BeanMetadataAttributeAccessor类,所以,在调用getAttribute的时候,就调用了BeanMetadataAttributeAccessor的getAttribute方法了
Spring源码深度解析(郝佳)-学习-元数据解析
那我们分析了元数据配置,存储,获取,那元数据在Spring中到底有什么用处呢?
目前我也没有发现使用元数据的地方,还侍后期发现再补了

本文的项目github地址是[https://github.com/quyixiao/spring_tiny/tree/master/src/main/java/com/spring_101_200/test_101_110/test108_mytestbean]

相关标签: Spring源码