Spring Boot桥接模式示例中依赖注入匹配逻辑的疑问
关于Spring Boot中桥接模式Bean匹配逻辑的解答
1. Notification与对应Sender的匹配逻辑
Spring处理同类型多Bean的依赖注入时,默认优先通过构造方法参数名与Bean名称匹配。
你的示例里,AppConfig中创建EmailSender和SmsSender的方法名(默认就是Bean的名称)应该是emailSender和smsSender。如果EmailNotification的构造方法参数是Sender emailSender,SmsNotification的构造方法参数是Sender smsSender,Spring就会把名称为emailSender的Bean注入到EmailNotification中,smsSender则注入到SmsNotification。
如果参数名和Bean名不匹配,也可以用@Qualifier注解指定目标Bean名称,示例代码:
public EmailNotification(@Qualifier("emailSender") Sender sender) { this.sender = sender; }
2. NotificationController中区分两个Notification实现类
逻辑和上面完全一致:如果NotificationController的构造方法参数是Notification emailNotification和Notification smsNotification,Spring会自动匹配名称为emailNotification和smsNotification的Bean(Bean名称默认是创建它们的方法名,也可以通过@Bean(name="xxx")手动指定)。
要是不想依赖参数名,同样可以给参数加@Qualifier注解明确指定,示例代码:
public NotificationController(@Qualifier("emailNotification") Notification emailNoti, @Qualifier("smsNotification") Notification smsNoti) { this.emailNoti = emailNoti; this.smsNoti = smsNoti; }
补充:如果同类型Bean中有一个被标记为@Primary,Spring会优先注入该Bean,但你的场景需要区分两个实现,所以不会用到这个注解。
内容的提问来源于stack exchange,提问作者Ulises CT
相关产品推荐
相关产品推荐

