@Resource注解放在属性上和放在方法上的区别

在spring项目中,自动装配可以用@Autowired注解也可以使用JSR-250规范中的@Resource注解,这里拿@Resource注解来说,该注解可以放在类的属性上或者是方法上(当然也可以放在class上)。两种情况下作用是一样的,使用哪一种和公司的规范走就可以了,但是还是有些许区别。

  • 在类的属性上添加
  1. 先使用字段名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败。
  2. 如果字段名字没有匹配到Bean则spring会尝试采用字段类型匹配,如果找打bean则注入,如果字段类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常, 注入失败。
  • 在setter方法上
  1. 先使用属性名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败。
  2. 如果属性名字没有匹配到Bean则spring会尝试采用属性参数类型匹配,如果找打bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常.注入失败。 
    注意是属性的参数类型,并不是属性的类型,注意区别
  • 网友答复:

这么说吧,注解如果写在属性上,那么底层操作是:发现该属性有该注解,然后获取注解的name,找到对应name的实体,如果没有name则根据类型来设置值。然后找到该属性对应的setter方法,然后将调用setter将对应的值传入进去。
如果直接写到setter方法上,那么也是同样的操作,但不同地方在于,写在属性上就多了一步找到setter方法的操作,写在setter上则少了这一步操作,这是个优化项。
对于性能来说,其实消耗不是很大,如果不是巨量操作的服务,一般的应用和服务都建议写在field上,因为方便维护和查看,因为本身对性能的影响微乎其微。
如果是巨量操作次数的系统,比如淘宝,那么强烈建议写在setter上,具体的你可以自己写demo,循环执行一亿次,或者10亿次,就能看出比较明显的区别了,但是你也会发现,1亿次的操作其实也差不了多少

可以参考Spring注解依赖注入的三种方式的优缺点

猜你喜欢

转载自blog.csdn.net/qq_40084325/article/details/111386064