@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. PYTHON 学习笔记2 流程控制工具以及函数定义、匿名函数

    前言 在上一节的学习中.已经介绍了几种基本类型.包括字符串的定义,以及字符串中索引.切片.字符串拼接的使用方法.以及基本的整形数据运算.一些之前都没有了解过的运算符.比如 ** 乘方 //整数除法等. ...

  2. CNN卷积神经网络入门整合(科普向)

    这是一篇关于CNN入门知识的博客,基本手法是抄.删.改.查,就算是自己的一个笔记吧,以后忘了多看看.   1.边界检测示例假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检 ...

  3. 【笔记】Git简明教程

    前言 Git这个东西我曾经有学过,但学的内容太多了,有点懵,不太理解,磕磕碰碰的,走了不少弯路.不过最近我在B站上发现了一个讲的很好的教程:<表严肃讲Git>.因此,我决定用文字的方式分享 ...

  4. PgSQL备份

    SQL转储. 这里我们用到的工具是pg_dump和pg_dumpall. 这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问.它会产生一个脚本文件,里面包含备份开始时 ...

  5. light oj1170 - Counting Perfect BST卡特兰数

    1170 - Counting Perfect BST BST is the acronym for Binary Search Tree. A BST is a tree data structur ...

  6. a标签没有闭合引起自动插入很多a标签的问题

    a标签中间没有内容的情况下,很容易忽略闭合 a标签一定要闭合,否则会在后面每个div后面插入同一个a标签 要以如下形式闭合: <div class="v5-index-containe ...

  7. Arm开发板+Qt学习之路-析构函数和对话框一起时

    先记录一下代码 一:先将指针释放掉,在显示对话框 void MainWindow::canResponseError(SendCanMsgThread *sendCanMsgThread ){ std ...

  8. Linux下通过二进制方式安装mysql5.7版本和系统优化

    本文主要介绍MySQL二进制软件包的安装/启动/关闭过程. 也许有人要问为什么要选择二进制的安装方式呢? 其实答案很简单,官方版本中已经把所有功能都配置好了,我们可以很方便地拿来使用. 官方MySQL ...

  9. 记一次Postgres CPU爆满故障

    问题描述 公司项目测试环境调用某些接口的时候,服务器立即崩溃,并一定时间内无法提供服务. 问题排查 服务器配置不够 第一反应是服务器需要升配啦,花钱解决一切!毕竟测试服务器配置确实不高,2CPU + ...

  10. Centos7 安装Python3.7

    如果电脑自带的python2.7 先卸载 1.强制删除已安装python及其关联 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 2.删 ...