@Autowired与@Resource详细诠释和区别(附带例⼦)
@Autowired 与@Resource:
1、@Autowired与@Resource都可以⽤来装配bean. 都可以写在字段上,或写在setter⽅法上。
2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:
@Autowired(required=false) ,如果我们想使⽤名称装配可以结合@Qualifier注解进⾏使⽤,如下:
Java代码
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
springframework作用3、@Resource 是JDK1.6⽀持的注解,默认按照名称进⾏装配,名称可以通过name属性进⾏指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查,如果注解写在setter⽅法上默认取属性名进⾏装配。当不到与名称匹配的bean时才按照类型进⾏装配。但是需要注意的是,如果name属性⼀旦指定,就只会按照名称进⾏装配。
只不过注解处理器我们使⽤的是Spring提供的,是⼀样的,⽆所谓解耦不解耦的说法,两个在便利程度上是等同的。
Java代码
@Resource(name="baseDao")
private BaseDao baseDao;
他们的主要区别就是@Autowired是默认按照类型装配的 @Resource默认是按照名称装配的
byName 通过参数名⾃动装配,如果⼀个bean的name 和另外⼀个bean的 property 相同,就⾃动装配。
byType 通过参数的数据类型⾃动⾃动装配,如果⼀个bean的数据类型和另外⼀个bean的property属性的数据类型兼容,就⾃动装配
-----------------------------------------------------------------------------------------------------------------------------------------
我们可以通过 @Autowired 或 @Resource 在 Bean 类中使⽤⾃动注⼊功能,但是 Bean 还是在 XML ⽂件中通过 <bean> 进⾏定义 —— 也就是说,在 XML 配置⽂件中定义 Bean,通过@Autowired 或 @Resource 为 Bean 的成员变量、⽅法⼊参或构造函数⼊参提供⾃动注⼊的功能。
⽐如下⾯的l
package com.wuxinliulei;
public class Boss {
private Car car;
private Office office;
// 省略 get/setter
@Override
public String toString() {
return "car:" + car + "\n" + "office:" + office;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-2.5.xsd
/schema/context
/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
<bean id="boss" class="com.wuxinliulei.Boss"/>
<bean id="office" class="com.wuxinliulei.Office">
<property name="officeNo" value="001"/>
</bean>
<bean id="car" class="com.wuxinliulei.Car" scope="singleton">
<property name="brand" value=" 红旗 CA72"/>
<property name="price" value="2000"/>
</bean>
</beans>
定义了三个bean对象,但是没有了我们书序的ref指向的内容
⽐如
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-2.5.xsd">
<bean id="boss" class="com.wuxinliulei.Boss">
<property name="car" ref="car"/>
<property name="office" ref="office"/>
</bean>
<bean id="office" class="com.wuxinliulei.Office">
<property name="officeNo" value="002"/>
</bean>
<bean id="car" class="com.wuxinliulei.Car" scope="singleton">
<property name="brand" value=" 红旗 CA72"/>
<property name="price" value="2000"/>
</bean>
</beans>
-------------------------------------------------------------------------------------------------------
spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的⽅式来完成注⼊依赖。在Java代码中可以使⽤ @Resource或者@Autowired注解⽅式来经⾏注⼊。虽然@Resource和@Autowired都可以来完成注⼊依赖,但它们之间是有区别的。⾸先来看⼀下:
a.@Resource默认是按照名称来装配注⼊的,只有当不到与名称匹配的bean才会按照类型来装配注⼊;
b.@Autowired默认是按照类型装配注⼊的,如果想按照名称来转配注⼊,则需要结合@Qualifier⼀起使⽤;
c.@Resource注解是由JDK提供,⽽@Autowired是由Spring提供
@Resource的⽅式;
d. @Resource和@Autowired都可以书写标注在字段或者该字段的setter⽅法之上
2、使⽤注解的⽅式,我们需要修改spring配置⽂件的头信息,修改部分红⾊标注,如下
<?xml version="1.0" encoding="UTF-8"?>
<beans /schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="Index of /schema/context"
xsi:schemaLocation="Index of /schema/beans
/schema/beans/spring-beans-2.5.xsd
Index of /schema/context
/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
</beans>
PS:
-
---------------------PS开始-------------------------------
在基于主机⽅式配置Spring的配置⽂件中,你可能会见到
<context:annotation-config/>
这样⼀条配置,他的作⽤是式地向 Spring 容器注册
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
这 4 个BeanPostProcessor。
注册这4个BeanPostProcessor的作⽤,就是为了你的系统能够识别相应的注解。
例如:
如果你想使⽤@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明⽅式如下
<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
如果想使⽤@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor
<bean class="org.springframework.beans.factory.annotation. CommonAnnotationBeanPostProcessor"/>
如果想使⽤@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。
<bean class="org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"/>
如果想使⽤ @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。
同样,传统的声明⽅式如下:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
⼀般来说,这些注解我们还是⽐较常⽤,尤其是Antowired的注解,在⾃动注⼊的时候更是经常使⽤,所以如果总是需要按照传统的⽅式⼀条⼀条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置⽅式,⾃动帮你完成声明。
不过,呵呵,我们使⽤注解⼀般都会配置扫描包路径选项
<context:component-scan base-package=”XX.XX”/>
该配置项其实也包含了⾃动注⼊上述processor的功能,因此当使⽤ <context:component-scan/> 后,就可以将 <context:annotation-config/>移除了。
⽐如:
<context:component-scan base-package="carPoolingController, carPoolingService, carPoolingDao" />
就把controller包下 service包下 dao包下的注解全部扫描了
----------------------------------------------PS结束------------------------------
3、修改以上配置⽂件的头信息后,我们就可以在Java代码通过注解⽅式来注⼊bean,看下⾯代码
(1)@Resource
public class StudentService3 implements IStudentService {
//@Resource(name="studentDao")放在此处也是可⾏的
private IStudentDao studentDao;
private String id;
public void setId(String id) {
this.id = id;
}
@Resource(name="studentDao") // 通过此注解完成从spring配置⽂件中查名称为studentDao的bean来装配字段studentDao,如果spring 配置⽂件中不存在 studentDao名称的bean则转向按照bean类型经⾏查
public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
}
public void saveStudent() {
studentDao.saveStudent();
System.out.print(",ID 为:"+id);
}
}
配置⽂件添加如下信息
<bean id="studentDao" class="com.wch.dao.impl.StudentDao">
</bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3"></bean>
(2)@Autowired
public class StudentService3 implements IStudentService {
//@Autowired放在此处也是可⾏的
private IStudentDao studentDao;
private String id;
public void setId(String id) {
this.id = id;
}
@Autowired
//通过此注解完成从spring配置⽂件中查满⾜studentDao类型的bean
/
/@Qualifier("studentDao")则按照名称经⾏来查转配的
public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
}
public void saveStudent() {
studentDao.saveStudent();
System.out.print(",ID 为:"+id);
}
}
配置⽂件添加如下信息
<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3"/>
在java代码中可以使⽤@Autowire或者@Resource注解⽅式进⾏装配,这两个注解的区别是:
@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使⽤按照名称装配,可以结合@Qualifier注解⼀起使⽤;
@Resource默认按照名称装配,当不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻依赖对象,当注解标注在属性的setter⽅法上,即默认取属性名作为bean名称寻依赖对象.
注意:如果没有指定name属性,并且按照默认的名称仍然不到依赖的对象时候,会回退到按照类型装配,但⼀旦指定了name属性,就只能按照名称装配了.
--------------------------
当我们在xml⾥⾯为类配置注⼊对象时,会发现xml⽂件会越来越臃肿,维护起来很⿇烦。这时候我们可以使⽤注解这种机制来为类配置注⼊对象。
java为我们提供了 javax.annotation.Resource这个注解。
spring框架提供了org.springframework.beans.factory.annotation.Autowired。
⼀般情况下我们使⽤ javax.annotation.Resource这个注解,因为这样我们就能实现和spring框架的解藕(不能认同,因为注解处理器还是
Spring提供的)。
@Resource可以作⽤于字段和函数上。当作⽤于字段上的时候,如果我们只是简单的这样写
@Resource
PersonDao  p;
这时候spring注⼊p的过程是 1:先查xml中是否有id为p的元素
2:如果没有到,则看是否有name属性(@Resource name=“”),有则查name
3:否则查PersonDao类型的元素
@Resource可作⽤于set函数上。
例如:
@Resource
public void setP(PersonDao p) {
this.p = p;
}
@Autowired注解是根据类型进⾏查,⽐如PersonDao p,他会去xml⽂件⾥查类型为PersonDao的元素

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。