上一节,我们学习了如何使用Qualifier注解,解决Autowired自动装配时的多bean问题,这节我们一起来看下
Resource注解的使用。话不多说,直接上干货。Resource注解和
Autowired注解类似,都用来声明需要自动装配的bean,区别在于Autowired是类型驱动的注入,而Resource是名称驱动的注入,所以前者存在多bean问题,而后者,只要保证bean命名唯一就不会出现多bean的问题。关于Resource注解,官方描述为,一般用在类属性或者setter方法上声明属性需要自动装配,如果在Resource注解中指定了bean的名称,则Spring会只按注解中的bame属性查找合适对象,然后进行装配。如果注解中没有指定名称,先按类属性的变量名查找,如果还是未找到,则按类型进行查找。下面我们一起来看下这三种情况:
1.Resource中指定name属性:
我们配置一个Person对象,它有一个food属性需要自动装配,这里我们在代码中指定名称为“apple”,我们看下能否装配成功。
publicclassPerson{
Resource(name="apple")
privateApplefood;
Override
publicStringtoString(){
return"Person{"+
"food="+food+
};
}
}
publicclassAppleimplementsFood{
}
beanname="apple"class="model.Apple"/bean
beanid="person"class="model.Person"
publicclassStartUp{
publicstaticvoidmain(String[]args){
ApplicationContextapplicationContext=
newClassPathXmlApplicationContext("applicationContext.xml");
Personperson=(Person)applicationContext.getBean("person");
System.out.println(person.toString());
}
}
我们执行main函数后,控制台输出如下,apple对象被成功的自动装配到person对象中:
2.不指定name属性,按变量名查找进行装配
我们只需要调整xml配置和Person类中的Resource注解的使用即可,代码如下:
publicclassPerson{
Resource
privateApplefood;
Override
publicStringtoString(){
return"Person{"+
"food="+food+
};
}
}
beanname="food"class="model.Apple"/bean
beanid="person"class="model.Person"
此时,我们并没有指定名称,而是让Spring按照我们定义的变量名“food”去查找可以被装配的bean对象,执行main函数后,仍然装配成功:
3.使Resource注解按类型查找进行装配
要实现按类型查找,那我们需要修改xml中对Apple类的实例命名,使得Spring在未指定Resource注解的name属性的前提下,按照变量名也无法找到对应的实例对象进行装配,修改代码如下:
publicclassPerson{
Resource
privateApplefood;
Override
publicStringtoString(){
return"Person{"+
"food="+food+
};
}
}
beanname="bigApple"class="model.Apple"/bean
beanid="person"class="model.Person"
我们执行main方法,依然能够注入成功:
以上即是本节的所有内容,如有错误之处,欢迎留言指正,同时欢迎感兴趣的同学