在看Spring源码时发现@Autowire有两种注入方式,一个是byType,一个是byName,其中byType是默认的,但是他不是唯一,当一个bean有多个beanId时,会报错,这时就需要指定这个类时由beanId来实现,就要使用byName了。
我们通过项目实例来了解下
定义MailConfig类
publicclassMailConfig{privateStringsubject;privateStringfrom;privateStringtext;privateStringreplyTo;privatebooleanhtml;-----
通过配置文件将MailConfig注册到spring Bean,并指定bean id
<beanid="CommonRegBillMail"class="com.sunisco.par.service.listener.MailConfig"><propertyname="from"value="web@sunisco.com"/><propertyname="replyTo"value="web@sunisco.com"/><propertyname="html"value="true"/><propertyname="text"><value><![CDATA[尊敬的客户:#context##url##customer_code##orgpwd##footer#]]></value></property></bean><beanid="paymentVerificationImportEmailConfig"class="com.sunisco.par.service.listener.MailConfig"><propertyname="from"value="web@sunisco.com"/><propertyname="replyTo"value="web@sunisco.com"/><propertyname="html"value="true"/><propertyname="text"><value><![CDATA[尊敬的客户#userCode#:#context#]]></value></property></bean>
这里我们看到MailConfig类对应了两个bean id 一个是CommonRegBillMail,一个是paymentVerificationImportEmailConfig
@Autowired注入依赖
如果这时使用
@AutowiredprivateMailConfigconfig;
就会报错,因为程序不知道是使用CommonRegBillMail还是paymentVerificationImportEmailConfig对应的配置,这时就要用byName的方式
@Autowired@Qualifier("CommonRegBillMail")privateMailConfigconfig;
byName的方式使用了 @Qualifier注解,他的作用就是根据参数进行依赖查找,从而实现功能。这时就不会报错了。
依赖使用
MimeMessageHelperhelper=newMimeMessageHelper(message,true,Charsets.UTF_8.name());helper.setFrom(config.getFrom());-------
以上就是 @Autowired通过ByName和ByType注入的流程和场景,如果想深入了解底层实现原理,推荐查看《Spring源码深度解析》第117页中两种注入方式的源码实现。