当前位置: 首页 > 知识库问答 >
问题:

具有生成器模式的Spring@Service逻辑

颛孙正谊
2023-03-14

我已经在Spring Boot应用程序中使用如下构建器模式实现了服务逻辑。

 @Service
public class EmailServiceImpl implements NotificationService{

    private Map<String, Object> emailTemplateContext;;
    private List<String> recipients;
    private String templateName;
    private String subjectName;
    private List<String> ccRecipients;

    public EmailServiceImpl() {
    }

    private EmailServiceImpl(String templateName, String subjectName, List<String> recipients,
            List<String> ccRecipients,
            Map<String, Object> emailTemplateContext) {
        this.emailTemplateContext = emailTemplateContext;
        this.recipients = recipients;
        this.templateName = templateName;
        this.subjectName = subjectName;
        this.ccRecipients = ccRecipients;
    }
    
    public static class EmailBuilder {

        private Map<String, Object> emailTemplateContext = new HashMap<String, Object>();
        private List<String> recipients;
        private String templateName;
        private String subjectName;
        private List<String> ccRecipients;

        public EmailBuilder withTemplateName(String templateName) {
            this.templateName = templateName;
            return this;
        }

        public EmailBuilder withSubjectName(String subjectName) {
            this.subjectName = subjectName;
            return this;
        }

        public EmailBuilder withTemplateContextValues(String key, String value) {
            this.emailTemplateContext.put(key, value);
            return this;
        }
        
        public EmailBuilder withTemplateContextValues(String key,List< String> value) {
            this.emailTemplateContext.put(key, value);
            return this;
        }

        public EmailBuilder withRecipients(List<String> recipients) {
            this.recipients = recipients;
            return this;
        }

        public EmailBuilder withCCRecipients(List<String> ccRecipients) {
            this.ccRecipients = ccRecipients;
            return this;
        }

        public EmailServiceImpl build() {
            return new EmailServiceImpl(templateName, subjectName, recipients, ccRecipients, emailTemplateContext);
        }
    }
    
    public void send() {
     // implement email send logic
    }
}

然后这将被注入另一个类中,如下所示

 public class EmailSender{
private EmailBuilder emailBuilder;
    EmailSender(EmailBuilder emailBuilder){
     this.emailBuilder=emailBuilder;
}

public void sendEmail(){
                this.emailBuilder
                .withRecipients(executionRunBO.getEmailRecipients().stream().map(email -> email.getEmail())
                        .collect(Collectors.toList()))
                .withSubjectName("Reports Draft ").withTemplateName("/emails/reports.ftlh")
                .withTemplateContextValues("userName", "TestUser").build().send();

}
}

与Spring的Builder模式相关的问题很少。

>

如何从服务类外部调用EmailServiceImpl类的EmailBuilder?因为在我的示例中,我已经将EmailBuilder作为构造函数参数注入,然后Spring框架抛出了它

需要类型为“”的bean。。。找不到EmailServiceImpl$EmailBuilder。

请帮我澄清那些事情。

共有1个答案

郎玮
2023-03-14

你在这里混合了很多功能。我会让它更精简。

我会创建一个dto类Email,而不是Spring bean。

public class Email {
    private Map<String, Object> emailTemplateContext;
    private List<String> recipients;
    private String templateName;
    private String subjectName;
    private List<String> ccRecipients;

    private Email(String templateName, String subjectName, List<String> recipients,
                             List<String> ccRecipients,
                             Map<String, Object> emailTemplateContext) {
        this.emailTemplateContext = emailTemplateContext;
        this.recipients = recipients;
        this.templateName = templateName;
        this.subjectName = subjectName;
        this.ccRecipients = ccRecipients;
    }

    public static class EmailBuilder {
        // your builder code, just build the Email 
    }

}

然后有一个发送电子邮件的服务。

@Service
public class EmailServiceImpl implements NotificationService {
    
    public void sendEmail(Email email) {
        
    }

}

像这样叫它

emailService.sendEmail(new Email.EmailBuilder().build());

无需从电子邮件和电子邮件生成器创建服务。

 类似资料:
  • 问题内容: 我想将一个Web服务URL请求表示为一个对象,并发现在继承层次结构中可能有很多通用参数。一个请求可以有很多参数,一些是必选参数,而其他是可选参数,我相信Bloch的Builder模式是一个不错的选择,它可以使用流畅的接口模拟命名参数。 具体来说,我正在设计Google Maps网络服务API,该API具有常规的网络服务请求 和是必填参数,也是必填参数。还有一个可选参数。 每个服务都有其

  • 亦称: 建造者模式、Builder 意图 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中; 甚至还有更糟糕的情况, 那就是这些代码散落在客户端代码的多个位置

  • 问题 你需要准备一个复杂的、多部分的对象,你希望操作不止一次或有不同的配置。 解决方案 创建一个生成器封装对象的产生过程。 Todo.txt 格式提供了一个先进的但还是纯文本的方法来维护待办事项列表。手工输入每个项目有损耗且容易出错,然而 TodoTxtBuilder 类可以解决我们的麻烦: class TodoTxtBuilder constructor: (defaultParamet

  • 在Effective Java(第二版)的第2项中,作者提到了以下关于在使用构建器时对参数施加不变量的内容: 在将参数从构建器复制到对象后,必须检查它们,并在对象字段而不是构建器字段上检查它们(项目 39)。如果违反任何不变量,则生成方法应引发非法状态异常(项 60)。 这是否意味着构建方法创建目标对象后,应该将其传递给验证例程以进行任何所需的验证? 另外,有人能解释一下这背后的原因吗?

  • 我基于这个答案实现了模式,我有以下asbtract配置: 我有以下具体配置: 这就是我使用它的方式 在X行我得到-找不到符号方法setHeight。我的错误是什么? 编辑 - 我将有一个扩展的诊断配置,必须扩展对话框配置等。我的意思是会有其他子类。

  • 我目前刚接触Spring integration。 基本上尝试使用Java Spring integration DSL异步轮询多个文件位置。我需要获取文件名,并使用文件名执行一些操作,最后将文件推送到S3,我的问题是这些使用文件执行操作的任务是否可以在任务执行器或服务激活器处理程序中执行。我不确定哪个地方是对的。 我在这里附上了示例代码。 还有一种方法可以检索通道中文件的文件名,因为我需要将它作