目录
1.1 通过名称注入(Autowire.BY_NAME,默认Autowire.NO)
一、Spring 注入属性的方式
1.1 通过名称注入(Autowire.BY_NAME,默认Autowire.NO)
@Component
public class Apple {
}
@Configuration
public class ByNameAutowaire {
//找对应Apple的set方法
@Bean(autowire = Autowire.BY_NAME)
public Fruit fruit(){
return new Fruit();
}
}
public class Fruit {
private Apple apple;
public Apple getApple() {
return apple;
}
public void setApple(Apple apple) {
this.apple = apple;
}
}
在Fruit中注入Apple属性,使用byName的方式,必须在Fruit中有对应的set()方法,在进行属性注入时,找的是set方法对应的bean的名字(比如setApple()方法找的就是apple这个bean对象)。在此时并没有进行属性的注入,而是将它放进了newPvs中,后续进行赋值。在找方法时需要如下的条件才满足(unsatisfiedNonSimpleProperties):
1. 必须要有set方法
2. pvs中不存在
3. 不是简单类型(CharSequence、Enum、Number、Date、Locale、URI、URL)
所以,以上几种类型使用@Bean(autowire = Autowire.BY_NAME)不会注入
protected void autowireByName(
String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
//从我们的bean定义中解析出我们的所有属性对象
String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
//循环我们当前bean的属性
for (String propertyName : propertyNames) {
if (containsBean(propertyName)) {
//显示的调用getBean所有属性的名称bean显示调用BeanFactory
Object bean = getBean(propertyName);
//把我们依赖的属性添加到pvs中
pvs.add(propertyName, bean);
//注册当前bean和属性依赖bean的依赖关系
registerDependentBean(propertyName, beanName);
if (logger.isDebugEnabled()) {
logger.debug("Added autowiring by name from bean name '" + beanName +
"' via property '" + p