Bootstrap

Spring中的Resource注解name属性值无法解析

spring6中有一个注解 @Resource , @Resource 和 @Resources 不一样,这两个注解区别很大,不能写错了。

其次, @Resource 注解有很多属性,其中的name属性默认,可以不用设置,但是设置后可能会出现name属性值无法解析的情况,
例如将 @Resource   在方法上生声明的时候, @Resource(name="")会报错:Bean创建异常以及嵌套异常,显示无法解析。如下图所示:

 

 

那么为什么会出现这个问题呢?因为 @Resource(name = "beanId"),是跟 @Component的属性值相关联的,因为 @Resource注解只能出现在属性上和setter方法上。
而出现在属性上的时候,该属性可能是一个类,这个类的 @Component注解的属性值其实对应的就是xml文件的beanId。
所以 @Resource的name属性值声明的属性的 @Component的属性值。

@Component注解声明在类上,属性值可以写,也可以不写,不写,默认是类名的第一个字母小写,其他单词首字母大写。

例如:

@Component("accountDao")
	public void AccountDao(){}

	public void AccountService(){
		@Resource("accountDao")
		private AccountDao accoutDao;
		...
		...
		...
	}

 
注意:以上代码中的 @Resouce("accountDao")  对应的可不是 private AccountDao accoutDao; 中的accoutDao,对应的是 @Component("accountDao")
对应的是AccountDao类的 @Component注解的属性值。这个我就搞混过了一次。要记住。

再比如说:

 

@Repository注解和@Component没什么区别,接口不用添加注解,在接口的实现类中可以添加注解。

 
@Resource(name = "accountDao")
private AccountDao accountDao;

// 对应的是@Repository("accountDao")
// 不是private AccountDao accountDao;中的accountDao。

@Repository("accountDao")
public class AccountDaoImpl implements AccountDao(){}

我学习spring是通过这个链接学习的,有朋友感兴趣可以学习一下,里面有全面的讲述spring框架,也有详细的讲解@Resource注解的,我发这个文章主要是为了记录细节,毕竟搞混过一次。

 视频地址:https://www.bilibili.com/video/BV1Ft4y1g7Fb?t=16.3&p=79

;