zoukankan      html  css  js  c++  java
  • @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进行匹配,匹配成功,则赋值,不成功则报错

  • 相关阅读:
    关于eclipse 的 web.xml文件 There is '1' error in 'j2ee_1_4.xsd'. 错误
    C#实现Java的AES加密解密算法
    jsp页面报错javax.servlet.jsp.jspException cannot be resolved to a type
    Ubuntu下查看jdk安装路径
    【Mysql】启动mysql报错mysqld_safe error: log-error set to /var/log/mariadb/mariadb.log
    spring mvc导出csv案例
    MyBatis 调用存储过程(详解)
    mysql 无限递归出现 data too long for column 'xxx' 错误
    java的maven项目头上有红叉解决方法
    Nexus3搭建Docker等私服
  • 原文地址:https://www.cnblogs.com/quartz/p/12600342.html
Copyright © 2011-2022 走看看