前言
这两天看公司的另外一个项目中service层使用的@Autowired注解,但是idea检测后报错了,虽然这个错误不影响整个项目的正常运行,但是喜欢探究的我还是决定一探究竟。
所以就有了自己的探究,之所以自己要去探究这个问题,也是自己的这块内容的不扎实导致的,现在很多内容都被封装了,导致我们对底层的原理并不是很清楚,自己也还没有静下心来好好去看看源码,今天就稍作学习吧。
一、换成@Resource后
这样就报错了,所以问题就来了,关于autowired和resouce注解的区别,网上也有很多类似的文章,我 就不赘述了。
我就提一点区别:
@Autowired(org.springframework.beans.factory.annotation.Autowired):由spring提供,只按照byType注入
@Resource(javax.annotation.Resource):由JSR-250规范中的J2EE提供,默认是按照byName自动注入
补充:JSR规范相关文章:
老生常谈-JSR规范
Java的JSR规范
二、依旧使用Resource但不报错
网上有些是调整idea对注解的检测级别,但我个人认为这不是解决问题的根本,因为其他的地方也是用Autowired注入的,为啥没有报错,所以我就只想从代码层面去解决这个问题,看了一下需要添加一个组件注解。
添加后就不报错了
但为啥添加完Component就不报错了呢?
三、Mapper注解探究
@Mapper 是 Mybatis 的注解,和 Spring 没有关系,在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。
看到这里是不是想到了什么?没错,autowired是spring的注解,要想将GateDogDao注入到spring中,必须添加Component注解,而仅仅添加@Mapper注解是不行的,因为Mapper注解是Mybatis注解,和spring没关系,所以在GateLogDao上添加一个Component注解后,就注入到了Spring中,自然就可以和Autowired一起使用,至于底层代码,感兴趣的可以自己找找资料再去查看。我就不多说了,涉及的类可以看AutowiredAnnotationBeanPostProcessor
四、Resource注解探究
再来说说使用Resouce注解为啥不报错,我们看一下Resource注解所在包
这个是JSR规范中rt包下的,
注解下面有一段话:
翻译过来就是:
资源的JNDI名称。对于字段注释,默认值为字段名称。对于方法注释,缺省值为与该方法相对应的JavaBeans属性名称。对于类注释,没有默认值,必须指定它。
这个注解和spring没有关系,不受spring管理也可以自动注入,默认是按照名称注入,也可以按照类型注入,所以即便GateLogDao类没有Component注解也不会报错。
发现的一个现象就是现在公司的老项目都是用的Autowired注解,而不是Resource注解,主要是考虑到springcloud项目中用spring会更好的兼容,当然这个看个人和公司习惯,用Resource的话可以和spring进行解耦,这样一旦spring改变了,也不需要改动太多的代码。
以上也是对自己这块知识的盲区的一个补充,有不对的地方,还望留言指正。
-------------你知道的越多,不知道的越多--------------