代码改变世界

Resource和Autowired区别

2022-08-26 08:58  ly772186472  阅读(98)  评论(0)    收藏  举报

遇到的问题:  Could not autowire. No beans of 'UserMapper' type found.

 

 

 

 

 解决方案: 将@Autowired 改为@Resuorce

个人理解: 因@Autowired 是按照byType装配的,mybaits-plus 没有实现类pojo,而是框架通过反射机制映射出来的实体对象类; 

所以通过@Resource默认按照名字自动装配; 

package com.ly.mybaitsplus;

import com.ly.mybaitsplus.mapper.UserMapper;
import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
class MybaitsPlusApplicationTests {
    @Resource
    private UserMapper user;
    @Test
    public void testSelect(){

    }
    @Test
    void contextLoads() {
    }

}

 

另外一种: 直接在UserMapper方法中直接声明 他就是一个对象 @Repository;这样也行,相当有欺骗了spirng,告诉他,这个userMapper就是一个实体对象

修改:UserMapper

@Repository
public interface  UserMapper extends BaseMapper<User> {
}

 

 

 

使用场景:

  @Resource和@Autowired 都是做bean注入时使用

  @Resourece是JDK的注解,不是spring的注解;由包 javax.annotation.Resourece提供,需要导入;但是Spring支持该注解注入

相同和不同点:

  共同点:两者都可以写在setter方法,和字段上,不需要再写setter方法

  不同点:

      1: @Autowired是spring提供的注解,只按照byType注入

public class TestServiceImpl {
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

    Autowired是按照类型byType装配依赖对象的,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置required 属性值为false.如果想按照名字(byName)来装配,可以结合Qualifier qualifier注解一起使用(通过类型匹配多个 candidate,在没有Qualifier的情况下,会使用对象名作为最后的fallback匹配)

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

      2:@Resource

      Resource默认是按照ByName自动注入的,@Resource有两个属性:name和 type; Spring将@Resource注解的name属性解析为bean的名字,而type

属性则解析为bean的类型,如果使用name属性,使用byName自动注入策略,而使用type属性时使用byType自动注入策略;如果即不指定name也不指定tyoe属性,这是将

反射机制使用byName自动注入策略

public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

 

@Resource装配顺序

  1::如果同时指定name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛异常。

  2:如果指定了name,则从上下文中查找名字(id)匹配的bean进行装配,找不到则抛异常

  3:如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

  4:如果即没有指定name,又没有指定type,则自动按照byName方式进行装配,如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配

  @Resource的作用哪个相当于@Autowired,只不过@Autowired 按照byType自动注入

  

在启动spring的时候,首先要启动容器:

启动spring容器时 ,会默认寻找容器扫描范围内的可加载bean,然后查找哪些bean上的属性和方法上有@Resource注解

找到@Resource注解后,判断@Resource注解括号中的name属性是否为空,

如果为空:看spring容器中的bean的id与@Resource要注解的那个变量属性名是否相同,

如相同,则匹配成功;如不相同,看spring容器中bean的id对应的类型是否与@Resource要注解 那个变量属性对应的类型是否相等,若相等,匹配成功,若不相等,匹配失败

如果@Resource注解括号中的name属性不为空,看name的属性值和容器中的bean的id名是否相等,如相等,则匹配成功;如不相等,则匹配失败