【问题标题】:auto- instantiated bean parameters?自动实例化的 bean 参数?
【发布时间】:2017-01-26 09:59:04
【问题描述】:

我是spring和spring mvc的新手

我正在学习一门课程,他们提供以下 @Configuration 类:

@Configuration
public class MailConfig {

    @Bean
    @ConditionalOnProperty(name="spring.mail.host",
        havingValue="foo",
        matchIfMissing=true)
    public MailSender mockMailSender() {
        return new MockMailSender();
    }

    @Bean
    @ConditionalOnProperty(name="spring.mail.host")
    public MailSender smtpMailSender(**JavaMailSender javaMailSender**) {
        SmtpMailSender mailSender = new SmtpMailSender();
        mailSender.setJavaMailSender(javaMailSender);
        return mailSender;
    }
}

在第二个 bean (smtpMailSender) - 有一个参数: JavaMailSender javaMailSender

但是调用者没有传递参数。

导师说:“在bean方法内部如果我们像这样传递参数,参数将被spring注入

我的问题是 - 我怎么知道这是 Spring 的预期行为?导师是根据什么来的? JavaMailSender 是否有一个特定的特性,它是 spring 的一部分,因此被视为一个组件,或者这里还有其他东西在起作用?

【问题讨论】:

    标签: java spring spring-mvc dependency-injection


    【解决方案1】:

    简单地说,这就是 Spring 在使用基于 Java 的配置时的工作方式。

    当检测到带有@Bean 注释的方法并且它具有参数时,Spring 将默认自动连接它们。它是按类型进行的。

    @Bean
    @ConditionalOnProperty(name="spring.mail.host")
    public MailSender smtpMailSender(JavaMailSender javaMailSender) {
        SmtpMailSender mailSender = new SmtpMailSender();
        mailSender.setJavaMailSender(javaMailSender);
        return mailSender;
    }
    

    在这种情况下,它将JavaMailSender 类型的 bean 注入此方法。当您使用默认配置并将被注入的 Spring Boot 时。如需更多信息,请参阅the reference guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多