@Autowired

1、属于spring的注解,如果不想和Spring耦合的太紧,就不推荐使用。

2、默认情况下,要求依赖对象必须存在,不能为null。如果允许为空,那么设置属性值required为false。

3、默认按照类型装配(byType)。到底什么是类型装配,看下边的例子:

情形1:

public interface UserService {
}

@Service
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
   @Autowired
   private UserService userService;
}

分析:在上边的测试类中使用@Autowired注入时,编辑器会报错:

Could not autowire. There is more than one bean of 'UserService' type.
Beans:
userServiceImpl   (UserServiceImpl.java)
userServiceImpl2   (UserServiceImpl2.java)

原因是,@Autowired是默认按照类型注入的,它就告诉代码,我就需要一个UserService类型的类就行,但是代

码却有两个UserService类型的类。这时,@Autowired还可以按照名称(userService)注入,但是也没有满足的bean,就报错了。

情形2:

public interface UserService {
}

@Service("userService")
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Autowired
  private UserService userService;
   
  @org.junit.Test
  public void test1(){  
  System.out.println(userService);
  }
}

打印:
demo.springboot.Service.UserServiceImpl@47b11ec7

分析:这时@Autowired是按照名称注入的。

情形3:

public interface UserService {
}

@Service("myUserService")
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Autowired
  @Qualifier("myUserService")
  private UserService userService;
   
  @org.junit.Test
  public void test1(){  
  System.out.println(userService);
  }
}

打印:
demo.springboot.Service.UserServiceImpl@47b11ec7

分析:这时如果UserServiceImpl有个别名”myUserService“,那么@Autowired需要和 @Qualifier配合使用,然后根据@Qualifier中的属性值,按照名称注入。

情形4:

public interface UserService {
}

@Service
public class UserServiceImpl implements UserService {
}

@Service
@Primary
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Autowired
  private UserService userService;
   
  @org.junit.Test
  public void test1(){  
  System.out.println(userService);
  }
}

打印:
demo.springboot.Service.UserServiceImpl2@6a756082

分析:如果在UserServiceImpl或者UserServiceImpl2上加上@Primary,就有了一个优先的顺序,就会注入加了@Primary注解的类

@Resource

1、属于J2EE JSR250规范的实现。所以建议使用@Resource注解,以减少代码和Spring之间的耦合。

2、默认按照名称装配(byName),什么是安装名称装配,看下面的例子:

情形1:

public interface UserService {
}

@Service
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Resource
  private UserService userService;

  @org.junit.Test
  public void test1() {
      System.out.println(userService);
  }
}

分析:执行代码会报错:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demo.springboot.Test': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'demo.springboot.Service.iface.UserService' available: expected single matching bean but found 2: userServiceImpl,userServiceImpl2

这个报错很明显,虽然编译器在起初没有报错,但是由于@Resource是默认按照名称注入的,@Resource想要一个bean的name是userService的,但是却没有,UserServiceImpl和UserServiceImpl2的beanName默认为类名小写。所以这时匹配不上名称,就会按照类型注入,但是却发现两个类型UserService的类,所以报错了(expected single matching bean but found 2)。

情形2:

public interface UserService {
}

@Service("userService")
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Resource
  private UserService userService;

  @org.junit.Test
  public void test1() {
      System.out.println(userService);
  }
}

打印:
demo.springboot.Service.UserServiceImpl@727320fa

分析:给UserServiceImpl的beanName写为userService,这时@Resource按照name注入了。

情形3:

public interface UserService {
}

@Service
@Primary
public class UserServiceImpl implements UserService {
}

@Service
public class UserServiceImpl2 implements UserService {
}

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
  @Resource
  private UserService userService;

  @org.junit.Test
  public void test1() {
      System.out.println(userService);
  }
}

打印:
demo.springboot.Service.UserServiceImpl@44784e2f

分析:加了@Primary,@Resource就可以按照类型注入了。

@Qualifier

1、在给字段注入时,不能独立使用,必须和@Autowired配合使用。

2、给方法参数注入时,可以独立使用。

@Autowired、@Resource、@Qualifier区别的更多相关文章

  1. @Resource、@Autowired、@Qualifier 区别(表格显示)

    @Resource.@Autowired.@Qualifier 区别(表格显示) 区别项 @Resource @Autowired @Qualifier 谁提供的 jdk提供,包是javax.anno ...

  2. @Autowired @Resource @Qualifier的区别

    参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...

  3. Spring @Resource、@Autowired、@Qualifier区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...

  4. @Autowired,@Resource,@Qualifier,@Primary,@Inject的作用和区别

    @Autowired注解的用法:可以用于构造器,方法,参数,字段进行属性注入,有一个required属性,默认是true,当改成false时,如果注入的属性在容器中不存在也不会报错@Resource该 ...

  5. @Autowired 与@Resource的区别(详细)

    参考:@Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@Pos ...

  6. @Autowired 与@Resource的区别详解

    spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  7. 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

    1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...

  8. java @Autowired与@Resource的区别

    @Autowired与@Resource的区别     1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认 ...

  9. Spring 注释 @Autowired 和@Resource 的区别

    Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired ...

  10. @Autowired & @Resource 区别 & 解读@Bean

    一样     Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上.也可以写在setter方法上 不一样 1.来源不一样 @Autowired 由Spr ...

随机推荐

  1. DaSiamRPN学习

    9月14日,2018年视觉目标跟踪挑战赛(Visual-Object-Tracking Challenge 2018)的结果在ECCV Workshop上揭晓.VOT2018共设三项任务:Baseli ...

  2. React+wangeditor+node富文本处理带图片上传

    最近有个需求出现在我的视野中,因为我的另外的博客需要上传文章,但是我不想每次都在我的数据库中慢慢的修改格式,所以我另做了一个后台去编辑文本后发送给服务器,那么这里就涉及到两点,一个是富文本,一个是需要 ...

  3. Linux系统资料

    Linux的心得: 1)Linux由众多微内核组成,其源代码完全开源: 2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4. TCP/IPv6和链 ...

  4. Vim 安装和配置、优化

    Vim 介绍 Vim 官网:http://www.vim.org/ Vim 安装 CentOS:sudo yum install -y vim Ubuntu:sudo apt-get install ...

  5. centos7利用系统镜像修复grub

    1 故障描述 由于错误操作,导致grub配置文件失效,系统开机后一直卡在下面的画面. 2 解决办法 这时候,就要利用系统镜像光盘,进入修复模式,然后按下面图示操作 进入镜像的shell环境,如下图所示 ...

  6. ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试

    一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...

  7. Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List

    条件去重 我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如: List<Integer> nu ...

  8. codewars--js--Number of trailing zeros of N!

    问题描述: Write a program that will calculate the number of trailing zeros in a factorial of a given num ...

  9. 想学大学计算机课?这 37 门 CS 专业必修课,了解一下

    最近,不少高校延迟开学,大家只能宅家上网课. 有一些朋友,想趁此期间,多学点计算机的专业课,却不知从何学起. 211,985大学的计算机专业课都是经过授课教师精心安排的,从大一到大四,课程合理设置,循 ...

  10. SAP 如何看某个TR是否传入了Q或者P系统?

    SAP 如何看某个TR是否传入了Q或者P系统? 两种方式可以查询. 1)进入Q系统或者P系统.SE16,看表TPALOG, 输入请求号码, 执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空 ...