@resource与@authorwired在本质上它们的作用是一样的,都是省去为一个对象变量写get,set方法,自动为这个对象注入实例化对象即注入依赖。而它们的注入的方式还是有所区别的
@resource是基于j2ee的注解,默认是按名字进行注解,若不指定装配bean的名字,当注解写在字段上时,默认取字段名,按照名称查找通过set方法进行装配,倘若有多个子类,则会报错。若想不报错,只需加(required=false)
例如:
package com.chexiang.common; public class Customer { @Resource private Person person; public Customer(Person person) { this.person = person; } public void setPerson(Person person) { this.person = person; } //... }
package com.chexiang.common; @Component public class Person { //... }
其对应的xml装配过程是如下,先定义customer的bean,然后申明装配方式是byname,再定义一个person类的bean。这是id名为customer的bean对象的对象属性会自动按照属性名去找寻id名与属性名一样的bean,则id为person的bean被注入到了customer的person变量里
<bean id="customer" class="com.chexiang.common.Customer" autowire="byName" /> <bean id="person" class="com.chexiang.common.Person" />@autowired是基于spring的注解org.springframework.beans.factory.annotation.Autowired,它默认是按类型进行的装配的,如果想要它按名字进行装配只需在@autowired下面加@qualifier("name")`注解,其对应的xml装配方式如下
两个Bean,person 和 ability.
package com.chexiang.common; public class Person { @autowired
private Ability ability; //... }
package com.chexiang.common; @Component public class Ability { private String skill; //... }
<!-- person has a property type of class "ability" --> <bean id="person" class="com.yiibai.common.Person" autowire="byType" /> <bean id="invisible" class="com.yiibai.common.Ability" > <property name="skill" value="Invisible" /> </bean>id名为person的bean会把ability属性按照bean里定义的class的类型进行装配,因为id名为invisible的bean的class类型与id名为person的变量ability的类型相同,则进行装配。