spring 注解Resource/Autowired以及配置文件中default-autowire参数

一直搞不懂 default-autowire 是干嘛, 如果出了一些问题,百度一通就说 把 default-autowire 去掉 即可。。。 懵B ,因此 好好的百度和 看了 一些 spring 学习文档: .@Autowired按byType自动注入。

@Resource默认按byName自动注入。

但是@Resource有两个属性是比较重要的,分是name和type;

如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略;

3.@Autowired是spring自己定义的注解,@Resource是J2EE的,由JSR-250规范定义。

PS:用@Resource,可以减少与spring的耦合。其实都无所谓。

而注解 @Resource 和 @Autowired 对于 设置 default-autowire 没有关系的, default-autowire 的设置针对的是 xml 的配置。

不建议打开default-autowire="byName",这会导致很多不确定的注入。 如果 某个bean 需要 的话 , 可以 在 xml 里面 针对这个bean 进行设置的。不用 在 xml 里面 全局设置 default-autowire。

 <bean id="student" class="com.haiwi.spring.Student" autowire="byName">
        <property name="stu_name" value="Tom" />
    </bean>

当然 如果 xml 比较多的 地方 需要 这样配置 bean , 配置属性 , 可以将 这部分配置 放入 另一个 xml 里面, 全局设置 default-autowire 即可,就 不会对其他 的xml 配置造成影响了。 default-autowire 自动装配是 为了 简化配置, 当然 麻烦点 配置也好, 看懂更加明白的。

我们都知道, spring 提供了Resource、Autowired这两个注解用于注入,另外在xml配置文件中,beans标签下有一个参数default-autowire用来设置默认的注入类型。

这里我先说明一下default-autowire的用途。

首先default-autowire参数有几个可选值:

default:实际上是会优先执行constructor然后是byType

byType:这个是会根据类型去注入,当找到了会直接注入,没有找到不会报错,但是找到多个会报No unique bean of type的错误

byName:这个会根据name注入

constructor:这个是通过构造注入

no:不启用自动注入

下面说一下@Autowired是怎么 工作 的,网上很多人都说这个是通过byType注入的,实际上并不完全正确,实际上他是这样处理的:

1、根据类型找到所有满足条件的bean

2、判断bean长度,如果没有,则根据@Autowired中的required属性进行判断是否抛出异常(默认为true)

3、如果多于一个,则尝试寻找最优的那一个,如果最优的未找到,则抛出异常

4、如果只有一个,则直接使用此bean

所以说这个注解实际上会去寻找最优的一个Bean。另外这里注入也有个问题,就是注解放在属性上,则通过的是属性名去注入的,这个没什么说的;但是如果放在setter上,则是通过参数选择的注入,比如setA(A b),实际上他会注入到你上面声明的b变量上,而不是a。

最后我们来了解下@Resource是怎么工作的。

网上都说这个是根据的byName去注入的,其实也不对,实际上他是下面这样的:

1、获取名称,判断容器中是否存在此name的bean

2、如果存在,则直接使用此name进行查询

3、否则退化到默认的autowire查找方式

而@Resource其实没有@Autowired那么怪异,属性上用的名称就是属性民,而setter方法上也是方法名确定的。比如setA(A b)注入的就是a属性。

参考地址: http://www.tuicool.com/articles/myqUvay

Spring IOC 容器可以按照某种规则对容器中的bean 进行自动装配。而无须我们通过显式的方式进行配置。Spring 为 厌恶配置的开发人员提供了一条偷懒的方法,可以按照某些规则进行Bean的自动装配。、

<bean> 元素 提供了一个 指定自动装配类型的属性 : autowire="<自动装配类型>"

byName :  根据名称进行自动匹配。假设 Boss 有一个名为 car 的属性,如果容器中刚好有一个名为 car的bean , spring  就会自动将其装配给Boss的car 属性。

byType : 根据类型进行自动匹配,假设Boss 有一个 Car类型的属性,如果容器中刚好有一个Car类型的bean, spring 就会自动将其装配给Boss 的这个属性。

constructor :与 ByType 类似, 只不过它是针对 构造函数注入而言的,如果Boss有一个构造函数,构造函数包含一个Car类型的入参,如果 容器中 有一个Car 类型的 Bean ,则Spring 将自动将这个Bean作为Boss 构造函数的入参,如果容器中没有找到和构造函数入参匹配类型的Bean ,Spring 将抛出异常。

autodelect : 根据 Bean的自省机制决定采用 byType 还是 construtor 进行自动装配:  如果bean 提供了默认的构造函数,则采用 byType ;否则采用 constructor . 


转载于:https://my.oschina.net/ouminzy/blog/889164

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值