Java中的@Resource注解和@Autowired注解的解析
Java中的@Resource注解和@Autowired注解的解析
我们经常会遇到⽤@Autowired注解注⼊对象是会出现weak warning的现象,⽽换成了@Resource注解就没有警告了。这引起了我的好奇:Spring属于第三⽅的,J2EE是Java⾃⼰的东西。使⽤@Resource可以减少代码和Spring之间的耦合,所以更推荐使⽤
@Resource。
@Resource (建议⽤)
resource和autowired注解的区别@Resource 注解的注⼊⽅式与@Autowired注解的注⼊⽅式的区别在于@Resource 默认注⼊⽅式是基于name的,⽽@Autowired是基于type的。
类全称: javax.annotation.Resource
默认注⼊⽅式: byName(反射机制)
指定注⼊⽅式:
如果使⽤name属性,则使⽤byName⾃动注⼊策略–> @Resource(name = “good”)
如果使⽤type属性,则使⽤byType⾃动注⼊策略–> @Resource(type = java.lang.String.class)
Bean查规则:
同时指定了name和type, 则在Spring上下⽂中到唯⼀匹配的Bean, 不到抛出异常–> @Resource(name = “good”, type = java.lang.String.class)
指定了name, 则在Spring上下⽂中到名称(使⽤注解注册的Bean的name⼀般为类名称的驼峰写法)匹配的Bean进⾏装配,不到或者到多个则抛出异常–>@Resource(name = “good”)
指定了type, 则在Spring上下⽂中到匹配的唯⼀Bean进⾏装配, 不到或者到多个则抛出异常–>@Resource(type = java.lang.String.class)
没有指定name或者type, 按照byName进⾏查装配, 如果没有匹配, 则回退到⼀个原始类型(⽐如String hello变量的原始类型就是java.lang.String)进⾏匹配(根据type匹配原始类型), 不到或者到多个则抛出异常 。
@Autowired
类全称: org.springframework.beans.factory.annotation.Autowired
默认注⼊⽅式: byType
Bean查规则:
默认是要对象必须存在的, 如果允许对象为null, 则要设置 required = false
如果是根据类型查, 有多个相同类型(is-a)的实现类,那么会抛出异常 , 此时需要加上@Qualifier(“hello”)注解指定注⼊的Bean的标识名称(不⼀定特指id或者name,就是指的@Service(“thisTarget”)中的thisTarget这个值,也不排除没有这个值⾃动查其id或者name的可能性), 则按照标识名称去查,若有多个相同名称的Bean,则抛出异常。
我们知道在spring中有三种依赖注⼊⽅式:变量注⼊,构造器注⼊和set⽅法注⼊
变量注⼊
//注⼊service
@Autowired
SysAdminService sysAdminService;
变量(field)注⼊就是如此简洁,但这种注⼊⽅式存在⼏个问题的:
不能有效的指明依赖。当依赖注⼊的对象为null时,在启动依赖容器时遇到这个问题都是配置的依赖注⼊少了⼀个注解什么的。这种⽅式就过于依赖注⼊容器了,当没有启动整个依赖容器时,这个类就不能运转,在反射时⽆法提供这个类需要的依赖。
依赖注⼊的思想就是如果⼀个类使⽤了依赖注⼊的类,当这个类拜托它的依赖时仍然可以正常运⾏,但使⽤变量注⼊⽅式是不能这样保证的。
在使⽤构造器注⼊或者set注⼊时候,就可以避免这些问题。
使⽤set⽅式时,这是⼀种选择注⼊,可有可⽆,即使没有注⼊这个依赖,那么也不会影响整个类的运⾏。
使⽤构造器⽅式时已经显式注明必须强制注⼊。通过强制指明依赖注⼊来保证这个类的运⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论