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

本贴最后更新于 2612 天前,其中的信息可能已经渤澥桑田

目前为止,我们只为 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(); }
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...