@Autowire中byName和byType在项目中的使用

在看Spring源码时发现@Autowire有两种注入方式,一个是byType,一个是byName,其中byType是默认的,但是他不是唯一,当一个bean有多个beanId时,会报错,这时就需要指定这个类时由beanId来实现,就要使用byName了。

我们通过项目实例来了解下

  1. 定义MailConfig类

     public class MailConfig {
         private String subject;
         private String from;
         private String text;
         private String replyTo;
         private boolean html;
      -----
    复制代码
  2. 通过配置文件将MailConfig注册到spring Bean,并指定bean id

     <bean id="CommonRegBillMail" class="com.sunisco.par.service.listener.MailConfig">
                     <property name="from" value="web@sunisco.com " />
                     <property name="replyTo" value="web@sunisco.com " />
                     <property name="html" value="true" />
                     <property name="text">
                             <value><![CDATA[
      尊敬的客户:
    
             #context#
    
    
             #url#
             #customer_code#
             #orgpwd#
    
    
             #footer#
    
                 ]]></value>
                     </property>
             </bean>
    
             <bean id="paymentVerificationImportEmailConfig" class="com.sunisco.par.service.listener.MailConfig">
                     <property name="from" value="web@sunisco.com " />
                     <property name="replyTo" value="web@sunisco.com " />
                     <property name="html" value="true" />
                     <property name="text">
                             <value><![CDATA[
      尊敬的客户#userCode#:
    
             #context#
    
                 ]]></value>
                     </property>
             </bean>
    复制代码

    这里我们看到MailConfig类对应了两个bean id 一个是CommonRegBillMail,一个是paymentVerificationImportEmailConfig

  3. @Autowired注入依赖

    如果这时使用

    @Autowired
    private MailConfig config;
    复制代码

    就会报错,因为程序不知道是使用CommonRegBillMail还是paymentVerificationImportEmailConfig对应的配置,这时就要用byName的方式

    @Autowired
    @Qualifier("CommonRegBillMail")
    private MailConfig config;
    复制代码

    byName的方式使用了 @Qualifier注解,他的作用就是根据参数进行依赖查找,从而实现功能。这时就不会报错了。

  4. 依赖使用

    MimeMessageHelper helper = new MimeMessageHelper(message, true, Charsets.UTF_8.name());
    helper.setFrom(config.getFrom());
    -------
    复制代码

以上就是 @Autowired通过ByName和ByType注入的流程和场景,如果想深入了解底层实现原理,推荐查看《Spring源码深度解析》第117页中两种注入方式的源码实现。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享