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

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

@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容器中的对象


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

如果没有唯一匹配类型对象,则注入失败

示例代码:

@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
}
相关文章
|
4天前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
28 6
|
1月前
|
Java Spring 容器
Spring中@Autowired和@Resource注解异同点
Spring中@Autowired和@Resource注解异同点
31 0
|
8天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系
|
1月前
|
开发框架 前端开发 Java
Spring和Spring Boot:两者的区别与应用场景
Spring和Spring Boot:两者的区别与应用场景
53 1
|
1月前
|
Java 数据库 Spring
Spring Bean、Java Bean和对象的区别与联系
Spring Bean、Java Bean和对象的区别与联系
42 0
|
27天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
41 0
|
2月前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
48 0
|
1月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
111 0
|
1月前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
15天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置