@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进行匹配,匹配成功,则赋值,不成功则报错

posted @ 2020-03-30 18:34  山那边风景  阅读(187)  评论(0编辑  收藏  举报