天天看点

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

Spring主要提供以下两种方法用于依赖注入

基于属性Setter方法注入

基于构造方法注入

例子:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

如上Communication类有一个messaging属性,并含有setMessaging方法,那么使用Setter方法注入的时候,只需要使用如下XML配置即可:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

这里省略了ActiveMQMessaging的定义,实际上ActiveMQMessaging类是<code>Messaging</code>接口的一个实现类。

例子

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

注意以上Communication类有一个构造方法Communication(Encryption encryption),且含有一个入参,类型为Encryption,那么使用构造方法注入的时候,XML配置如下:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

注意,这里省略了RSAEncryption的定义,不用在意这些细节,该类是<code>Encryption</code>接口的一个实现类。

另外,为了避免构造方法重载带来的歧义,这里指定了入参类型为com.websystique.spring.domain.Encryption。

bean的装配有两种方式,手动装配和自动装配。注意,不要混淆,bean的装配是依赖注入的具体行为,依赖注入的时候需要根据bean的名称或类型等进行装配。

手动装配:通过在&lt;property&gt; 或者 &lt;constructor&gt;标签中使用ref属性,在上一小节的“依赖注入”部分使用的就是手动装配;

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

自动装配:在&lt;bean&gt;标签中使用<code>autowire</code>属性;

本小节主要关注自动装配,自动装配有以下四种方式:

<code>autowire="byName"</code> : 根据名称

<code>autowire="byType"</code> : 根据类型

<code>autowire="constructor"</code> : 根据构造方法入参类型

<code>autowire="no"</code> : 不使用自动装配,即默认方式,手动装配

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

该类有一个属性叫<code>applicationUser</code>,那么根据名称自动装配的XML配置如下:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

该类有一个属性类型为<code></code>EmployeeAddress<code></code>,那么根据类型自动装配的XML配置如下:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

该类有一个构造方法,入参的类型为Instrument<code></code>,那么根据构造方法自动装配的XML配置如下:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

该类有一个属性license,由于我们不打算使用自动装配功能,那么只能使用手动装配了,XML配置如下:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

注意,如果不配置license的ref引用的话,license将为null。

主要涉及以下三个注解

<code>@Autowired</code>

<code>@Resource</code>

<code>@Qualifier</code>

@Autowired可应用于构造方法、属性、setter方法或配置类@Configuration的方法上,该注解根据bean的数据类型进行装配,如果你想希望根据bean的名称进行装配可以使用带name属性的<code>@Resource</code>注解;另外<code>@Qualifier</code>注解经常与@Autowired注解结合使用,用于解决一个应用中存在多个同种类型的bean的情况,下面将给出各个注解的示例。

setter方法上

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

构造方法上

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

属性上

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

例子背景::存在两个Car接口的实现类,其中一个Car接口的实现类已被注册为bean,且name为Mustang

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

注意,以上例子如果不使用<code></code><code>@Qualifier</code>限定的话,将抛出如下异常,表明存在多个类型相同的bean:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.websystique.spring.domain.Car] is defined: expected single matching bean but found 2: Ferari,Mustang

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:970)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)

    ... 14 more

最后提醒下,被@Autowired注解标注默认情况下能保证成功注入,如果注入不成功(往往是找不到,或存在歧义),Spring会抛出异常。当然,有时候可能会有特殊需求,不希望bean被强制装配,那么可以在@Autowired上添加<code>required=</code><code>false</code>属性,表明该bean的装配是可选的,找不到的话,就为null吧,如下示例:

Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解
Spring bean依赖注入、bean的装配及相关注解依赖注入装配相关注解

基于以上原因,虽然@Autowired注解与@Resource功能类似,但是@Autowired还是比@Resource强大了那么一点点,个人建议使用@Autowired注解。

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/6222595.html,如需转载请自行联系原作者