• @Autowired 和@Resource区别


    @Autowired和@Resource 都可以写在属性和setter方法上,@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

    @Autowired

    @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。
    @Autowired采取的策略为按照类型注入。

    @Service
    public class UserService extends AbstractBaseService<User> implements IUserService {
        /**
         *  缓存 userId -> user password
         */
    	private final static ConcurrentMap<String, String> passwords = new ConcurrentHashMap<>(256);
    
    	@Autowired
    	private UserMapper repository;
    

    如上代码所示,spring从容器中找到类型为UserMapper的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。

    @Qualifier告诉spring具体去装配哪个对象。

    @Service
    public class UserService extends AbstractBaseService<User> implements IUserService {
        /**
         *  缓存 userId -> user password
         */
    	private final static ConcurrentMap<String, String> passwords = new ConcurrentHashMap<>(256);
    
    	@Autowired
            @Qualifier(name="userMapper")
    	private UserMapper repository;
    

    以下是userMapper的定义,使用了@Qualifier注解

    @Service
    @Qualifier("userMapper")
    public class UserMapper  implements XXXXXX{
     
    

    @Resource

    @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
    @Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型
    所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

    public class TestServiceImpl {
      // 下面两种@Resource只要使用一种即可
      @Resource(name="userDao")
      private UserDao userDao; // 用于字段上
    

    注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

    @Resource装配顺序:

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

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

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

    4. 如果没有写name属性,则会让属性的名称的值和spring中ID的值做匹配,如果匹配成功则赋值
      如果匹配不成功,则会按照类型进行匹配,如果匹配不成功,则报错
      如果有name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错

  • 相关阅读:
    Nginx的编译,和简单的配置问题
    项目课DNS主域名解析服务器(四)
    项目课DHCP服务(三)
    项目课PXE自动装机(二)
    Nginx 详细讲解
    ansible批量管理工具的搭建与简单的操作
    SUID,SGID,SBIT这些到底是什么
    密码截取
    分治和递归的算法实现求数组A[n]中的前k个最大数
    回溯法实现求1n个自然数中r个数的组合
  • 原文地址:https://www.cnblogs.com/quartz/p/12600342.html
Copyright © 2020-2023  润新知