注解@Resource和@Autowired的区别及使用

Spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。

共同点

@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

不同点

@Resource是Java自己具有的注解,@Resource有两个属性是比较重要的,分是nametype
Spring将@Resource注解的name属性解析为bean的名字,
而type属性则解析为bean的类型(即class的全路径,如com.tulun.Bean.User)。
所以如果使用name属性,则使用byName的自动注入策略(即通过名称找到类,然后再注入到属性里),
而使用type属性时则使用byType自动注入策略。
如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired是spring提供的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。
如果涉及到type无法辨别注入对象(;例如接口有多个实现类)时,那需要依赖@Qualifier或@Primary注解一起来修饰。

使用注解注入属性依赖实例:

在创建的bean文件夹下的类头添加@Component,声明bean的id、并提供set、get、toString方法

package com.tulun.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("book")
public class Book {
    @Value("4")
    private Integer id;
    @Value("书名")
    private String name;
    @Value("描述")
    private String desc;//描述

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Book(Integer id, String name, String desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Book() {
    }


}

对基本数据类型赋值使用@Value("。。。")
自定义类型使用 @Resource(name="。。。") //bean里的id

package com.tulun.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

//是单例模式
@Component("user")//注解中user  等价于 applicationcontext.XML配置形式中bean里的  id属性
public class User {
    @Value("3")
    private Integer id;
    @Value("基础班3")
    private String name;
    @Resource(name="book") //bean里的id
    private Book book;//依赖

//  注入集合类型
    private Map<String ,String> map; //map 类型属性
    //1、数组类型属性
    private String[] courses;

    //2、list集合类型属性
    private List<String> list;
    //4、set集合类型属性
    private Set<String> sets;

//有参构造函数   new User(12,"zhangsan")

    public User(Integer id, String name, Book book) {
        this.id = id;
        this.name = name;
        this.book = book;
    }
//setter方法注入
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public String[] getCourses() {
        return courses;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", book=" + book +
                ", map=" + map +
                ", courses=" + Arrays.toString(courses) +
                ", list=" + list +
                ", sets=" + sets +
                '}';
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Set<String> getSets() {
        return sets;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    //    如果指定了有参构造函数,(就不会生成默认的无参构造函数,xml里通过  无参 构造函数实例化就会报错),
    public User() {
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Book getBook() {
        return book;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBook(Book book) {
        this.book = book;
    }
}

在配置文件里开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--开启 扫描 注解: 指定的包  路径下的类,会扫描的到类的方法,属性上-->
    <context:component-scan
            base-package="com.tulun.bean"/>
    <!--只 扫描 类中 属性 的注解(不建议使用)-->
    <!--<context:annotation-config></context:annotation-config>-->
</beans>

在主函数里测试生成对象

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("springconfig.xml");//注解形式获取
        User user3 = (User) applicationContext.getBean("user");

        System.out.println(user3);

输出:

User{id=3, name='基础班3', book=Book{id=4, name='书名', desc='描述'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值