spring 事件模型_Spring–设计领域模型和服务层

spring 事件模型

我们将为时间表管理构建应用程序。 因此,让我们首先考虑一些用例和实体。 让我用几个项目符号写它们:
  1. 任务由经理分配给员工。 一项任务可以分配给许多员工。
  2. 员工将他在某些任务上工作的小时数填充到系统中。
  3. 经理/员工查看时间表上的报告(时间表可以更改)。

让我们稍微回顾一下这些要点,然后尝试将这种简单的人类语言转换为程序员可以发现的某些关系和实体。

  • 实体:经理,员工,时间表,任务

好的,我们现在应该对领域有了更好的了解,所以让我们创建maven项目并实现类。 有了Maven,您将获得漂亮干净的项目结构。 您所需要做的就是安装Maven,并在项目中包含pom.xml。 您可以“手动”执行操作,并通过终端构建应用程序(在这种情况下,只需创建常规项目并添加pom.xml文件)。 我更喜欢使用一些其他工具。 IntelliJ IDEA,NetBeans和Springsource Tool Suite具有现成的Maven支持。 如果您使用的是纯Eclipse,请检查m2eclipse插件。

无论哪种方式,这都是我们项目的一些基本Maven配置:

<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'><modelVersion>4.0.0</modelVersion><groupId>org.timesheet</groupId><artifactId>org.timesheet</artifactId><version>0.0.1-SNAPSHOT</version><name>Timesheet Management On Spring</name><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build>
</project>

现在让我们实现领域模型。 创建包org.timesheet.domain并定义以下类。

package org.timesheet.domain;public class Employee {private String name;private String department;public Employee(String name, String department) {this.name = name;this.department = department;}public String getName() {return name;}public String getDepartment() {return department;}
}
package org.timesheet.domain;public class Manager {private String name;public Manager(String name) {this.name = name;}public String getName() {return name;}
}
package org.timesheet.domain;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Task {private List<Employee> assignedEmployees = new ArrayList<Employee>();private Manager manager;private boolean completed;private String description;public Task(String description, Manager manager, Employee... employees) {this.description = description;this.manager = manager;assignedEmployees.addAll(Arrays.asList(employees));completed = false;}public Manager getManager() {return manager;}public List<Employee> getAssignedEmployees() {return assignedEmployees;}public void addEmployee(Employee e) {assignedEmployees.add(e);}public void removeEmployee(Employee e) {assignedEmployees.remove(e);}public void completeTask() {completed = true;}
}
package org.timesheet.domain;public class Timesheet {private Employee who;private Task task;private Integer hours;public Timesheet(Employee who, Task task, Integer hours) {this.who = who;this.task = task;this.hours = hours;}public Employee getWho() {return who;}public Task getTask() {return task;}public Integer getHours() {return hours;}/*** Manager can alter hours before closing task* @param hours New amount of hours*/public void alterHours(Integer hours) {this.hours = hours;}@Overridepublic String toString() {return 'Timesheet [who=' + who + ', task=' + task + ', hours=' + hours+ ']';}}

如您所见,Manager和Employee类没有很多属性,它们在这里只是为了拥有类型安全模型。 在“现实世界”中,他们可能还有其他各种属性,例如姓,生日,地址等等,甚至可能是普通的父类。
另外,我们现在并不真正在乎各种约束。 例如,我们只能在任务上填写整数小时,依此类推。

现在是时候定义我们的服务层–定义业务操作并为这些操作建立接口。 因此,让我们制作软件包org.timesheet.service 。 首先,我们将创建GenericDao接口,在其中我们将为系统中的每个实体定义基本的CRUD操作。

package org.timesheet.service;import java.util.List;public interface GenericDao<E, K> {void add(E entity);void update(E entity);void remove(E entity);E find(K key);List<E> list();}

现在,让我们不必担心实际的持久层-让我们创建一些虚拟实现并将所有数据存储在内存中。 我们将其放入新包– org.timesheet.service.impl中 。 不用担心,稍后我们将使用Hibernate。 这是虚拟实现的代码:

package org.timesheet.service.impl;import java.util.ArrayList;
import java.util.List;import org.timesheet.service.GenericDao;public class InMemoryDao<E, K> implements GenericDao<E, K> {private List<E> entities = new ArrayList<E>();@Overridepublic void add(E entity) {entities.add(entity);}@Overridepublic void update(E entity) {throw new UnsupportedOperationException('Not supported in dummy in-memory impl!');}@Overridepublic void remove(E entity) {entities.remove(entity);}@Overridepublic E find(K key) {if (entities.isEmpty()) {return null;}// just return the first one sice we are not using any keys ATMreturn entities.get(0);}@Overridepublic List<E> list() {return entities;}}

接下来,我们将编写我们的第一个简单测试。 现在,我们将第一个依赖项添加到JUnit库的pom.xml文件中。 因为它是第一个,所以我们还需要将其包装到dependencies元素中,如下所示:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency></dependencies>

这是我们针对Employee DAO的第一个非常简单的单元测试。 我们现在不会做其他事情,因为我们还没有真正要测试的东西。 不过,更重要的是,我们如何依赖测试中DAO的实现(我们使用新的InMemoryDao… )。 这很不好,因为我们应该只测试定义接口的公共API。 在本教程的后面,您将看到Spring如何帮助我们解决此类问题。

package org.timesheet.service;import static org.junit.Assert.*;import java.util.List;import org.junit.Before;
import org.junit.Test;
import org.timesheet.domain.Employee;
import org.timesheet.service.impl.InMemoryDao;public class EmployeeDaoTest {private GenericDao<Employee, Long> employeeDao = new InMemoryDao<Employee, Long>();@Beforepublic void setUp() {for (int i = 0; i < 5; i++) {Employee e = new Employee('Mike ' + i, 'IT');employeeDao.add(e);}}@Testpublic void testAdd() {int oldSize = employeeDao.list().size();Employee e = new Employee('Bob', 'IT');employeeDao.add(e);int newSize = employeeDao.list().size();assertFalse (oldSize == newSize);}@Testpublic void testRemove() {int oldSize = employeeDao.list().size();Employee e = employeeDao.find(1L);employeeDao.remove(e);int newSize = employeeDao.list().size();assertFalse (oldSize == newSize);}@Testpublic void testUpdate() {//TODO: need real implementation}@Testpublic void testList() {List<Employee> list = employeeDao.list();assertNotNull (list);assertFalse (list.isEmpty());}}

如果需要,还可以为其他DAO剩余的测试编写单元测试。 但是由于我们现在没有合适的实现来测试,因此我们将在以后一起进行测试。

事情并非总是那么容易。 这不仅与CRUD操作有关,还与业务操作的通用性不足以在简单DAO中表达有关。 因此,让我们定义一些业务操作并为其创建单独的服务。 我们将此服务称为TimesheetService。

package org.timesheet.service;import org.timesheet.domain.Employee;
import org.timesheet.domain.Manager;
import org.timesheet.domain.Task;import java.util.List;/*** Business that defines operations on timesheets*/
public interface TimesheetService {/*** @return Finds the busiest task (with the most of employees).* Returns {@code null} when tasks are empty.*/Task busiestTask();/*** Finds all the tasks for the employee.* @param e Employee* @return Tasks*/List<Task> tasksForEmployee(Employee e);/*** Finds all the tasks for the manager.* @param m Manager* @return Tasks*/List<Task> tasksForManager(Manager m);}

好的,到目前为止很好。 您现在已经知道在下一个示例中我们将使用什么业务领域。 您可能现在想知道-我们还没有使用Spring,为什么呢? 请记住, Spring的最初目的是简化企业Java开发并鼓励POJO开发模型。 因此,将Spring与该基本模型一起使用将非常容易,因此我们不会将核心逻辑与不必要的依赖项混合在一起。

在下面的图片中,到目前为止,我们已经构建了项目的结构,因此请确保您表现良好。

参考: 第1部分–在vrtoonjava博客上由我们的JCG合作伙伴 Michal Vrtiak 设计域模型和服务层 。


翻译自: https://www.javacodegeeks.com/2012/09/spring-designing-domain-model-and.html

spring 事件模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

log4j/slf4j

log4j的使用 引入log4j.jar包<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency> 配置log4j.propertieslog4j.rootLoggerINFO,Console,OneFile,errFile #输出到控制…

Ubuntu 12.04下安装Oracle Express 11gR2

Ubuntu 12.04下安装Oracle Express 11gR2 [我的笔记] 参考1&#xff1a;http://www.linuxidc.com/Linux/2012-09/71382.htm 参考2&#xff1a;http://zhjack.blog.163.com/blog/static/14314920137153331286/ 1、点击这里下载Oracle express的安装介质 Oracle Database Express…

选择的按钮:将ToggleButtons用作单选按钮

对于MQTT.fx&#xff0c;我想使用ToggleButtons例如选择MQTT消息或QoS级别的解码&#xff1a; 我发现在ToggleGroup的上下文中&#xff0c;ToggleButton在选择/取消选择方面的行为与RadioButtons不同&#xff1a;与RadioButtons不同&#xff0c;ToggleButtons仍可以设置为未选…

php调用image类提示不存在的字体,php – 无效的字体文件名(imagettfbox)

这个问题一直被问到,但是我找不到我问题的正确答案……作为一个小背景说明,在将类文件从/ application / lib / class移到/库之前,所有代码都运行良好/ class ……我试过玩GDFONTPATH,相对的,绝对路径有和没有文件扩展名无济于事.以下是我们迄今为止尝试的一些行&#xff1a;pu…

linux文件属性之用户和组基础知识

root :x :0 :0 :root :/root :/bin/bash 账号名称 &#xff1a;账号密码 &#xff1a;账号UID &#xff1a;账号组GID &#xff1a;用户说明 &#xff…

Oracle常用命令大全(经典收藏)

一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户&#xff0c;如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭ORACLE系统 oracle>svrm…

oracle共享服务器模式的图,Oracle 11g笔记——专有服务器、共享服务器模式

专有服务器模式&#xff1a;适合批处理和大任务的应用共享服务器模式&#xff1a;适合有大量并发用户的应用共享服务器模式&#xff0c;处理过程&#xff1a;1、调度进程(Dispatcher)接受多个客户端(用户进程)的连接请求&#xff0c;并把这些请求放到一个公共队列中。2、空闲的…

基于django rest framework的mock server实践

网上找了一下mock server的实现&#xff0c;发现python的基本都是基于flask来实现的&#xff0c;因最近在学django&#xff0c;就尝试用drf实现了下&#xff1a; A brief introduction of sui_mock sui mock server is an attempt that aim at dealing some issues of the thir…

在Elasticsearch中索引Java Bean的简单方法

在数据存储方面&#xff0c;Java程序员习惯于使用魔术般持久的Java Bean。 诸如Hibernate和用于关系数据存储的JPA规范或Morphia和Spring Data MongoDB之类的解决方案是受欢迎的示例。 使用Elasticsearch的开发人员有时也有相同的愿望–传递Java bean并对其进行自动索引。 提供…

sturct stat 结构体中 st_mode 的含义

在<sys/stat.h>中定义的stat结构体内容如下&#xff1a; [cpp] view plaincopyprint? struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t…

MATLAB求解3对角系数矩阵方程,实验5.3 用追赶法求解三对角方程组

实验5.3 用追赶法求解三对角方程组实验目的会使用Matlab 语言编程使用追赶法求解线性方程组。实验原理设系数矩阵为三对角矩阵11222331110000000000000000n n n nn b c a b c a b A a b c a b ---?? ? ? ?? ? ?? ???则方程组Axf 称为三对角方程组。设矩阵A 非奇异&…

字符串操作以及打印 —— 实现上传下载的进度条功能

import sysdef processBar(num, total):rate num / totalrate_num int(rate * 100)if rate_num 100:r \r%s>%d%%\n % ( * rate_num, rate_num,)else:r \r%s>%d%% % ( * rate_num, rate_num,)sys.stdout.write(r)sys.stdout.flushprocessBar(10,100) 转载于:https://…

php去除每行的重复文本,php删除文本文件中重复行的方法

本文实例讲述了php删除文本文件中重复行的方法。分享给大家供大家参考。具体分析如下&#xff1a;这个php函数用来删除文件中的重复行&#xff0c;还可以指定是否忽略大小写&#xff0c;和指定换行符?1234567891011121314151617181920212223242526272829303132333435363738394…

Linux环境进程间通信(五): 共享内存(上)

Linux环境进程间通信&#xff08;五&#xff09;: 共享内存&#xff08;上&#xff09; 共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即…

JS 跳出多重循环

今天学到了如何跳出多重循环 转载于:https://www.cnblogs.com/dmc-nero/p/9573971.html

jna 使用_使用JNA的透明JFrame

jna 使用在使JFrame透明中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库…

通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)

linux查看用户密码(linux查看用户密码命令)2020-05-15 13:18:30共10个回答1、用户名和密码的存储位置存储帐号的文件:/etc/passwd存储密码的文件:/etc/shadow2、可以使用cat、more、head、tail以及vim等命令查看或者修改,如下图所示:比如要查找系统中admin普通用户的密码,则执行…

命名规范参考

转载于:https://www.cnblogs.com/jy13638593346/p/9575481.html

Guavate:桥接Guava和Java8的微型库

Java8很棒&#xff0c;并向JDK添加了一些有用的抽象&#xff0c;这些抽象通过Google出色的Guava commons库在Java社区中得到了普及。 小组讨论表明&#xff0c; 不久将有一个需要Java 8的Guava版本&#xff0c;从而弥合了Guava和Java8之间的鸿沟。 但是&#xff0c;直到这样的时…