在看Spring源码时发现@Autowire有两种注入方式,一个是byType,一个是byName,其中byType是默认的,但是他不是唯一,当一个bean有多个beanId时,会报错,这时就需要指定这个类时由beanId来实现,就要使用byName了。
我们通过项目实例来了解下
-
定义MailConfig类
public class MailConfig { private String subject; private String from; private String text; private String replyTo; private boolean html; ----- 复制代码
-
通过配置文件将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
-
@Autowired注入依赖
如果这时使用
@Autowired private MailConfig config; 复制代码
就会报错,因为程序不知道是使用CommonRegBillMail还是paymentVerificationImportEmailConfig对应的配置,这时就要用byName的方式
@Autowired @Qualifier("CommonRegBillMail") private MailConfig config; 复制代码
byName的方式使用了 @Qualifier注解,他的作用就是根据参数进行依赖查找,从而实现功能。这时就不会报错了。
-
依赖使用
MimeMessageHelper helper = new MimeMessageHelper(message, true, Charsets.UTF_8.name()); helper.setFrom(config.getFrom()); ------- 复制代码
以上就是 @Autowired通过ByName和ByType注入的流程和场景,如果想深入了解底层实现原理,推荐查看《Spring源码深度解析》第117页中两种注入方式的源码实现。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END