java - 自动实例化的bean参数?

标签 java spring spring-mvc dependency-injection

我是 spring 和 spring mvc 新手

我正在学习一门类(class),他们介绍了以下 @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 注入(inject)

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

最佳答案

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

当检测到用@Bean注释的方法并且它有参数时,Spring会默认自动连接它们。它按类型执行此操作。

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

在这种情况下,它将向此方法注入(inject)一个 JavaMailSender 类型的 bean。当您使用 Spring Boot 时,它是默认配置的并将被注入(inject)。有关更多信息,请参阅 the reference guide .

关于java - 自动实例化的bean参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41870881/

相关文章:

java - Java中的数组索引属性

java - 文本外观,TextView 和 CardView 内部

spring - 我需要为哪些实体创建 Spring Data 存储库?

java - 在 Spring 框架上使用 LocalDate 进行循环计算的最佳实现是什么?

java - Spring DateTime Conversion服务异常

java - 在一个 JSP 中访问另一个 JSP 中设置的 Bean

java - 通用列表的映射不能很好地转换

java - MockMvc 返回 404

java - 使用 @Query 'No converter found capable of converting from type XXX' 时出现错误 ("Select * from")

spring - 为什么我不能将 Spring Environment 对象注入(inject)到我的 bean 中?