一、场景举例
以如下场景的例子介绍(如下业务场景都为假设,主要为实例提供业务场景,如有不合理地方可以不必关注):
1.有两个场所公司和学校
2.公司和学校共有如下特点:学校岗位的员工都有名字和编号,公司岗位的员工有名字、编号与部门,学校岗位的员工与公司岗位的员工都是自然人
3.其中学校有三种类型的岗位:管理者、学生、老师,其中管理者、学生、老师都是员工,员工有共同的自然人特点:行为与思想
基于如上场景,设计业务代码,生成工具类,让学校或公司客户端通过某个服务端的spring配置就可以获取到某个岗位的所有信息(本代码用例没有业务逻辑,实际场景会有业务逻辑,只是展示场景框架)
二、服务端代码实现
1.按照岗位->员工->自然人的继承关系,实现自然人接口、员工接口、岗位实现类
/**
* 自然人
*/
public interface BasePerson {
String buildBehave(String industry,String position);
String buildThought(String industry,String proIdea);
}
/**
* 员工
*/
public interface Person extends BasePerson {
String personName (String name);
String personNo(String personNo);
}
/**
* 管理者
*/
public class Manager implements Person {
private String plan;
private int count;
private Map<String, Department> departments;
private Properties propers;
private List<Task> tasks;
private String[] orders;
private Meeting meeting;
public Manager(String plan,int count,Meeting meeting){
this.plan=plan;
this.count=count;
this.meeting=meeting;
}
@Override
public String personName (String name){
String strName="M"+name;
return strName;
}
@Override
public String personNo(String personNo){
String strNo="M"+personNo;
return strNo;
}
@Override
public String buildBehave(String industry,String position){
String strBehave=industry+"_"+position;
return strBehave;
}
@Override
public String buildThought(String industry,String proIdea){
String strThought=industry+"_"+proIdea;
return strThought;
}
public String getPlan() {
return plan;
}
public void setPlan(String plan) {
this.plan = plan;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Map<String, Department> getDepartments() {
return departments;
}
public void setDepartments(Map<String, Department> departments) {
this.departments = departments;
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
public String[] getOrders() {
return orders;
}
public void setOrders(String[] orders) {
this.orders = orders;
}
public Meeting getMeeting() {
return meeting;
}
public void setMeeting(Meeting meeting) {
this.meeting = meeting;
}
public Properties getPropers() {
return propers;
}
public void setPropers(Properties propers) {
this.propers = propers;
}
}
/**
* 学生
*/
public class Student implements Person {
//阅读
private String readDing;
//成绩
private Integer score;
@Override
public String personName (String name){
String strName="S"+name;
return strName;
}
@Override
public String personNo(String personNo){
String strNo="S"+personNo;
return strNo;
}
@Override
public String buildBehave(String industry,String position){
String strBehave=industry+"*"+position;
return strBehave;
}
@Override
public String buildThought(String industry,String proIdea){
String strThought=industry+"*"+proIdea;
return strThought;
}
public String getReadDing() {
return readDing;
}
public void setReadDing(String readDing) {
this.readDing = readDing;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}
/**
* 老师
*/
public class Teacher implements Person {
//授课内容
private String teachContext;
//考核
private String check;
@Override
public String personName (String name){
String strName="T"+name;
return strName;
}
@Override
public String personNo(String personNo){
String strNo="T"+personNo;
return strNo;
}
@Override
public String buildBehave(String industry,String position){
String strBehave=industry+"&"+position;
return strBehave;
}
@Override
public String buildThought(String industry,String proIdea){
String strThought=industry+"&"+proIdea;
return strThought;
}
public String getTeachContext() {
return teachContext;
}
public void setTeachContext(String teachContext) {
this.teachContext = teachContext;
}
public String getCheck() {
return check;
}
public void setCheck(String check) {
this.check = check;
}
}
2.关于管理者岗位属性的对象
/**
* 教室
*/
public class Classroom extends Department {
/**
* 桌子
*/
private String table;
/**
* 椅子
*/
private String chair;
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public String getChair() {
return chair;
}
public void setChair(String chair) {
this.chair = chair;
}
}
/**
* 部门
*/
public class Department {
//部门名称
private String departName;
//部门编号
private Integer departNo;
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
public Integer getDepartNo() {
return departNo;
}
public void setDepartNo(Integer departNo) {
this.departNo = departNo;
}
}
/**
* 实验室
*/
public class Laboratory extends Department{
/**
* 实验器材
*/
private String labTool;
/**
* 实验室老师
*/
private String labTeacher;
public String getLabTool() {
return labTool;
}
public void setLabTool(String labTool) {
this.labTool = labTool;
}
public String getLabTeacher() {
return labTeacher;
}
public void setLabTeacher(String labTeacher) {
this.labTeacher = labTeacher;
}
}
/**
* 会议
*/
public class Meeting {
//开始时间
private Date startTime;
//结束时间
private Date endTime;
//房间编号
private String roomNo;
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getRoomNo() {
return roomNo;
}
public void setRoomNo(String roomNo) {
this.roomNo = roomNo;
}
}
/**
* 科研室
*/
public class Research extends Department {
//电脑类型
private String computerType;
//导师
private String tutor;
public String getComputerType() {
return computerType;
}
public void setComputerType(String computerType) {
this.computerType = computerType;
}
public String getTutor() {
return tutor;
}
public void setTutor(String tutor) {
this.tutor = tutor;
}
}
/**
* 任务
*/
public class Task {
//任务名称
private String taskName;
//任务编号
private Integer taskNo;
//费用
private BigDecimal fee;
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public Integer getTaskNo() {
return taskNo;
}
public void setTaskNo(Integer taskNo) {
this.taskNo = taskNo;
}
public BigDecimal getFee() {
return fee;
}
public void setFee(BigDecimal fee) {
this.fee = fee;
}
}
三、业务代码生成pom
<dependency>
<groupId>util</groupId>
<artifactId>util-project</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
四、客户端通过spring配置设置岗位信息(以管理岗位为例)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="meeting" class="com.jd.util.project.service.springBaseGrammar.domain.Meeting">
<property name="startTime">
<!--factory-bean指定bean,factory-method指定bean的方法,constructor-arg方法的入参-->
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2018-01-01" />
</bean>
</property>
<property name="endTime">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2018-02-01" />
</bean>
</property>
<property name="roomNo" value="NO1"/>
</bean>
<bean id="laboratory" class="com.jd.util.project.service.springBaseGrammar.domain.Laboratory">
<property name="labTool" value="computer" />
<property name="labTeacher" value="张三" />
<property name="departName" value="laboratory"/>
<property name="departNo" value="1"/>
</bean>
<bean id="classroom" class="com.jd.util.project.service.springBaseGrammar.domain.Classroom">
<property name="table" value="table" />
<property name="chair" value="chair" />
<property name="departName" value="laboratory"/>
<property name="departNo" value="1"/>
</bean>
<bean id="research" class="com.jd.util.project.service.springBaseGrammar.domain.Research">
<property name="computerType" value="mac" />
<property name="tutor" value="李四" />
<property name="departName" value="laboratory"/>
<property name="departNo" value="1"/>
</bean>
<bean id="task1" class="com.jd.util.project.service.springBaseGrammar.domain.Task">
<property name="taskName" value="task1" />
<property name="taskNo" value="1" />
<property name="fee" value="100.99"/>
</bean>
<bean id="task2" class="com.jd.util.project.service.springBaseGrammar.domain.Task">
<property name="taskName" value="task2" />
<property name="taskNo" value="2" />
<property name="fee" value="88.01"/>
</bean>
<!-- property是通过setter注入,参数为值用value,参数为bean用ref,而且name的映射值都是String类型-->
<bean id="manager" class="com.jd.util.project.service.springBaseGrammar.impl.Manager">
<property name="plan" value="planOne"/>
<property name="count" value="6"/>
<property name="meeting" ref="meeting"/>
<property name="departments">
<!-- map注入-->
<map>
<entry key="laboratory" value-ref="laboratory"/>
<entry key="classroom" value-ref="classroom"/>
<entry key="research" value-ref="research"/>
</map>
</property>
<property name="propers">
<!-- properties注入-->
<props>
<prop key="account">zhanghao</prop>
<prop key="password">123456</prop>
</props>
</property>
<property name="orders">
<!-- 数组注入-->
<array>
<value>start</value>
<value>end</value>
</array>
</property>
<property name="tasks">
<!-- list注入-->
<list>
<ref bean="task1"/>
<ref bean="task2"/>
</list>
</property>
<!-- constructor-arg 通过构造函数注入,index为第index个参数-->
<constructor-arg index="0" value="plan2"/>
<constructor-arg index="1" value="6"/>
<constructor-arg index="2" ref="meeting"/>
</bean>
</beans>
五、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-config.xml")
public class SpringBaseGrammerTest {
private static final Logger logger = LoggerFactory.getLogger(SpringBaseGrammerTest.class);
@Test
public void springBaseGrammerTest(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring/spring-config-springBaseGrammer.xml");
Manager manager=(Manager)context.getBean("manager");
System.out.println(JSON.toJSONString(manager));
logger.info(JSON.toJSONString(manager));
}
}
输出结果:
{"count":6,"departments":{"laboratory":{"departName":"laboratory","departNo":1,"labTeacher":"张三","labTool":"computer"},"classroom":{"chair":"chair","departName":"laboratory","departNo":1,"table":"table"},"research":{"computerType":"mac","departName":"laboratory","departNo":1,"tutor":"李四"}},"meeting":{"endTime":1517414400000,"roomNo":"NO1","startTime":1514736000000},"orders":["start","end"],"plan":"planOne","propers":{"account":"zhanghao","password":"123456"},"tasks":[{"fee":100.99,"taskName":"task1","taskNo":1},{"fee":88.01,"taskName":"task2","taskNo":2}]}