JSR-250 的 @Resource
Spring 不但支持自己定义的 @Autowired 注解,还支持几个由 JSR-250 规范定义的注解,它们分别是 @Resource、@PostConstruct 以及 @PreDestroy 。
简单来说, @Resource 一个人就能实现 @Autowired
和 @Autowired + @Qualifier
两种功能。
@Resource 有两个重要属性:name 和 type:
-
name 属性解析为 JavaBean 的名字
-
type 属性则解析为 JavaBean 的类型
因此, name 属性和 type 属性两者同时出现,或同时不出现,亦或者出现一个,就意味着不同的『注入规则』,也就分成了 4 种不同情况:
-
如果同时指定了
name
和type
,则从 IoC 容器中查找同时匹配这两个条件的 Bean 进行装配,找不到则抛出异常。注意,type 和 name 两个条件是『且』的关系。
// Spring 在 IoC 容器中查找类型是 DaoDao,且名字是 catDao 的 JavaBean // 来为 animalDao 属性赋值。 @Resource(type = DogDao.class, name = "catDao") private AnimalDao animalDao;
-
如果只指定了
name
,则从 IoC 容器中查找 name 匹配的 Bean 进行装配,找不到则抛出异常。// Spring 在 IoC 容器中查找名字是 catDao 的 JavaBean // 来为 animalDao 属性赋值。 @Resource(name = "catDao") private AnimalDao animalDao;
-
如果只指定了
type
,则从 IoC 容器中查找 type 匹配的 Bean 进行装配,找不到或者找到多个,都会抛出异常。// Spring 在 IoC 容器中查找类型是 DogDao 的 JavaBean 来为 animalDao 属性赋值。 @Resource(type = DogDao.class) private AnimalDao animalDao;
-
如果既没有指定 name ,又没有指定 type ,则先以 name 为依据在 IoC 容器中查找,如果没有找到,再以 type 为依据在 IoC 容器中查找。
这种情况下,类型和名字不是『且』的关系,而是『或』的关系。
// Spring IoC 先在容器中查找名字为 animalDao 的 JavaBean 来为 animalDao 属性赋值。 // 如果没有找到,Spring IoC 再在容器中查找类型为 AnimalDao 的 JavaBean 来为 animal 属性赋值。 @Resource private AnimalDao animalDao;