Spring中@Autowired和@Resource的区别及详细使用

2023-02-16 16:20:06 浏览数 (1)

@Autowired是Spring提供的 @Resource是J2EE提供的

@Autowired: 获得对象的方式称之为byType(通过类型),如果需要指定名字,那么需要使@Qualifier(“bean的名字”)

在spring容器中寻找注解标定的类型的对象

  • 1.没有任何类型匹配的对象-------------发生异常
  • 2.有且只有一个匹配类型的对象-------注入成功
  • 3.有两个以及两个以上匹配类型的对象
    • 多个匹配类型对象中有匹配当前变量名为对象名称的 —注入成功
    • 多个匹配类型对重中没有匹配当前变量名为对象名称的 —注入失败

@Autowired 默认第一按照byType(类的类型),第二byName(l类名类ID)来加载类,所以当存在类型相同,多个beanname时,想注入某个类,就必须指定根据什么beanName查找,不用@Qualifier注解指定,则会以变量名为为beanName进行查找;

@Resource

获得对象的方式称之为byName(通过名称)

1.有和指定要获得的名称的对象匹配的Spring容器中的对象

  • 类型也匹配,注入成功
  • 类型不匹配,注入失败

2.没有和指定要获得的名称的对象匹配的Spring容器中的对象

  • 如果有唯一一个类型匹配的对象,则注入成功
  • 如果没有唯一匹配类型对象,则注入失败

示例代码:

代码语言:javascript复制
@Service
public class UserService implements IUserService {
    public void query() {
        System.out.println("hello world");
    }
}
@Service("userService2")
public class UserService2 implements IUserService {
    @Override
    public void query() {
        System.out.println("hello code");
    }
}


//-----------------------------------------------------------------------------------


@Autowired
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // 输出:hello world。会以变量名为为beanName进行查找
}

@Autowired
@Qualifier(value = "userService2")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // 输出:hello code
}

@Autowired
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
     userService2.query();
	 //hello code
}


//-------------------------------------------------------------------------------


@Resource
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    // hello world
}

@Resource(name = "userService")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
	userService.query();
	//hello world
}


@Resource
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
    userService2.query();
    //hello code
}

@Resource(name = "userService2")
private IUserService userService;
@GetMapping(value = "/query")
public void test(){
    userService.query();
    //hello code
}

@Resource(type = UserService2.class)
private IUserService userService2;
@GetMapping(value = "/query")
public void test(){
     userService2.query();
     //hello code
 }

@Resource(type = UserService2.class)
private IUserService entity;
@GetMapping(value = "/query")
public void test(){
     entity.query();
     //hello code
}

永远的 Hello World

0 人点赞