一、場景舉例
以如下場景的例子介紹(如下業務場景都爲假設,主要爲實例提供業務場景,如有不合理地方可以不必關注):
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}]}