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,执行如下逻辑。
对于testADefault配置,最后执行如下逻辑:
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"/>
由测试结果可以看到,当我们调用 getBean(“helloFactory”) 时,ApplicationContext 会返回一个 Hello 对象,该对象是 HelloFactoryBean 的 getObject 方法所创建的。如果我们想获取 HelloFactoryBean 本身,则可以在 helloFactory 前加上一个前缀&
,即&helloFactory
。