Spring-Autowire&FactoryBean

autowire

autowire 即自动注入的意思,通过使用 autowire 特性,我们就不用再显示的配置 bean 之间的依赖了。把依赖的发现和注入都交给 Spring 去处理,省时又省力。autowire 几个可选项,比如 byName、byType 和 constructor 等。autowire 是一个常用特性,相信大家都比较熟悉了,所以本节我们就 byName 为例,快速结束 autowire 特性的介绍。

当 bean 配置中的 autowire = byName 时,Spring 会首先通过反射获取该 bean 所依赖 bean 的名字(beanName),然后再通过调用 BeanFactory.getName(beanName) 方法即可获取对应的依赖实例。autowire = byName 原理大致就是这样,接下来我们来演示一下。

@Data
public class TestA {
    private TestB testB;
    private  TestC testC;

}

public class TestB {
}
public class TestC {
}
<bean name="testA" class="kl.idaas.feature.template.id.base.aspect.TestA" autowire="byName">
bean>

<bean name="testADefault" class="kl.idaas.feature.template.id.base.aspect.TestA">
  <property name="testB" ref="testB"/>
  <property name="testC" ref="testC"/>
bean>

对于使用byName方式在,创建bean进行属性填充时populateBean,执行如下逻辑。
Spring-Autowire&FactoryBean_第1张图片

对于testADefault配置,最后执行如下逻辑:

Spring-Autowire&FactoryBean_第2张图片

FactoryBean

FactoryBean?看起来是不是很像 BeanFactory 孪生兄弟。不错,他们看起来很像,但是他们是不一样的。FactoryBean 是一种工厂 bean,与普通的 bean 不一样,FactoryBean 是一种可以产生 bean 的 bean,好吧说起来很绕嘴。FactoryBean 是一个接口,我们可以实现这个接口

@Data
public class Hello {
    private String content;
}
public class HelloFactoryBean implements FactoryBean<Hello> {
    @Override
    public Hello getObject() throws Exception {
        Hello hello = new Hello();
        hello.setContent("拉拉");
        return hello;
    }

    @Override
    public Class<?> getObjectType() {
        return Hello.class;
    }
}

<bean id="helloFactory" class="kl.idaas.feature.template.id.base.aspect.HelloFactoryBean"/>

Spring-Autowire&FactoryBean_第3张图片

Spring-Autowire&FactoryBean_第4张图片

Spring-Autowire&FactoryBean_第5张图片

由测试结果可以看到,当我们调用 getBean(“helloFactory”) 时,ApplicationContext 会返回一个 Hello 对象,该对象是 HelloFactoryBean 的 getObject 方法所创建的。如果我们想获取 HelloFactoryBean 本身,则可以在 helloFactory 前加上一个前缀&,即&helloFactory

你可能感兴趣的:(spring,spring)