美文网首页
TinySpring构建过程Step5-为Bean注入Bean

TinySpring构建过程Step5-为Bean注入Bean

作者: ArthurPapa | 来源:发表于2019-01-19 22:22 被阅读0次

    目前为止,我们只为bean注入固定属性变量,但是如果一个Bean的属性变量是另一个Bean,那要怎么做?

    做法一:1. 先创建Bean,再为Bean注入属性 2. 在注入属性为Bean的时候,如果Bean没有被创建,则对此Bean重复 1)步骤。 因为都是先创建Bean再注入属性,所以不可能出现死循环状态。

    做法二: 1. 将所有的Bean都先创建(不注入属性)2. 再做注入属性操作

    做法一使用的是懒加载,做法二使用的是先创建后注入。以下以做法一为例。

    1. 要定义Bean作为属性,我们需要定义一个BeanReference,用来表示这个属性是一个Bean的引用。

    public class BeanReference {
    
        private String name;
    
        private Object bean;
    
        public BeanReference(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Object getBean() {
            return bean;
        }
    
        public void setBean(Object bean) {
            this.bean = bean;
        }
    }
    

    2. 依照做法一,在AutowireCapableBeanFactory初始化到为Bean属性的时候,获取/创建该Bean

    for (PropertyValue propertyValue : mbd.getPropertyValues().getPropertyValues()) {
        Field declaredField = bean.getClass().getDeclaredField(propertyValue.getName());
        declaredField.setAccessible(true);
        Object value = propertyValue.getValue();
        if (value instanceof BeanReference) {
            BeanReference beanReference = (BeanReference) value;
            value = getBean(beanReference.getName()); // 获取/创建该Bean
        }
        declaredField.set(bean, value);
    }
    

    3. 测试代码

       @Test
        public void testLazy() throws Exception {
            // 1.读取配置
            XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
            xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");
    
            // 2.初始化BeanFactory并注册bean
            AbstractBeanFactory beanFactory = new AutowireCapableBeanFactory();
            for (Map.Entry<String, BeanDefinition> beanDefinitionEntry : xmlBeanDefinitionReader.getRegistry().entrySet()) {
                beanFactory.registerBeanDefinition(beanDefinitionEntry.getKey(), beanDefinitionEntry.getValue());
            }
    
            // 3.获取bean
            HelloWorldService helloWorldService = (HelloWorldService) beanFactory.getBean("helloWorldService");
            helloWorldService.helloWorld();
        }
    

    相关文章

      网友评论

          本文标题:TinySpring构建过程Step5-为Bean注入Bean

          本文链接:https://www.haomeiwen.com/subject/woktjqtx.html