首页 > 编程问答 >Spring boot - 仅当 JavaMailSender 豆存在时自动配置

Spring boot - 仅当 JavaMailSender 豆存在时自动配置

时间:2024-06-04 11:08:29浏览次数:35  
标签:spring-boot

我相信这应该很简单,但我想不通。

我有一个这样的配置类:

@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
公共类 MyMailConfiguration {

    @Bean
    @ConditionalOnBean(JavaMailSender.class)
    public MyMailer myMailer(JavaMailSender javaMailSender) {
        return new MyMailer(javaMailSender);
    }
}

但 MyMailer 并未创建。如果我移除 ConditionalOnBean,JavaMailSender 将被注入,MyMailer 将被创建,但我希望条件存在,这样当我没有配置邮件时,它就不会崩溃。

剩下的唯一选择就是使用 ConditionalOnProperty,并观察 MailSenderAutoConfiguration 所做的相同属性,但这很糟糕。


遇到的问题是 @ConditionalOnBean 注解仅在应用程序上下文中已经存在 JavaMailSender 类型的 bean 时才会创建 MyMailer bean。当没有配置邮件发送器时, MailSenderAutoConfiguration 类就不会创建 JavaMailSender bean,因此 MyMailer bean 也不会被创建。

是对的,使用 ConditionalOnProperty 并检查 MailSenderAutoConfiguration 使用的相同属性不是一个优雅的解决方案。

为了解决这个问题,可以使用 @ConditionalOnClass 注解,而不是 @ConditionalOnBean @ConditionalOnClass 注解仅在类路径上存在指定的类时才会创建 bean。

以下代码展示了如何使用 @ConditionalOnClass 注解:

@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {

    @Bean
    @ConditionalOnClass(JavaMailSender.class)
    public MyMailer myMailer(JavaMailSender javaMailSender) {
        return new MyMailer(javaMailSender);
    }
}

使用 @ConditionalOnClass 注解,只要类路径上存在 JavaMailSender 类(无论是否配置了邮件发送器), MyMailer bean 就会被创建。如果未配置邮件发送器,则 javaMailSender 参数将为 null,因此需要在 MyMailer 构造函数或方法中处理这种情况。

以下是另一种解决方案,可以尝试使用 Optional

@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {

    @Bean
    public MyMailer myMailer(Optional<JavaMailSender> javaMailSender) {
        return new MyMailer(javaMailSender.orElse(null));
    }
}

使用这种方法,即使没有配置邮件发送器, MyMailer bean 也会被创建,并且 javaMailSender 参数将是 Optional.empty() 。 可以根据需要处理这种情况。

选择最适合需求的解决方案。

标签:spring-boot
From: 57501215

相关文章

  • 创建启动springboot项目的一些问题,如spring-boot-autoconfigure 自动加载注入配置
    1.springboot项目启动是否只需要3下面3个jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.b......
  • K8S 创建Spring-boot项目并进行项目启动与访问
     ##Spring-boot 的helloworld项目packagecom.example.demo;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMappi......
  • spring-boot学习记录
    ......
  • Spring-Boot整合Redis
    Spring-boot整合Redis导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置redis在application.yml下增加redis的相关配置sprin......
  • 快速创建一个spring-boot-starter
    可以使用springspi和import两种方法1.导入starter依赖1.1.maven管理工具<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>1.2.gradle管理工......
  • spring-boot spring-security oauth2 /oauth/token报401,403 问题
    2024-03-1012:20:55.281INFO58776---[nio-8002-exec-2]o.s.web.servlet.DispatcherServlet:InitializingServlet'dispatcherServlet'2024-03-1012:20:55.283INFO58776---[nio-8002-exec-2]o.s.web.servlet.DispatcherServlet:Completedi......
  • Spring-Boot AOP 的简单创建
    AOP切面1.导依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>定义一个切面类@Aspect@ComponentpublicclassAop......
  • Spring-Boot学习
    Spring-boot学习笔记从零开始创建项目先创建一个空的Maven项目,然后在pom.xml引入Spring-boot-starter的父依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2......
  • spring-boot整合jsp + mybatis ems小案例分析
    1.项目开发流程 需求分析:分析用户主要需求提取出项目核心功能根据核心功能构建页面原型 库表设计(概要设计):1.分析整个系统有哪些表2.分析出表之间关联关系3.确定字段 详细设计(流程图,伪代码):用来验证库表准确性 功能实现(编码):环境搭建具体功能实现 功能测试......
  • spring-boot-maven-plugin maven-compiler-plugin springboot demo
     <build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-......