本文共 9193 字,大约阅读时间需要 30 分钟。
package com.study.entity;/* * this is a simple entity class, descripe Student; */public class Student { String Name=""; String Sex=""; String Birth=""; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getSex() { return Sex; } public void setSex(String sex) { Sex = sex; } public String getBirth() { return Birth; } public void setBirth(String birth) { Birth = birth; } public String toString(){ return "Name="+this.Name+";Sex="+this.Sex+";Birthday="+this.Birth; }}
package com.study.dao;import com.study.entity.Student;/* * this interface define entity class student's dao(data access operation) interface */public interface StudentDAO { //学生操作,新增学生 boolean addStudent(Student student); //学生操作,删除学生 boolean delStudent(Student student); //学生操作,修改学生信息 boolean modifyStudent(Student student); //学生操作,查询学生信息,查询到返回学生对象,否则返回null Student queryStudent( String StudentName); }
package com.study.dao.impl;import com.study.dao.StudentDAO;import com.study.entity.Student;/* * this is implement of StudentDAO; */public class StudentDAOImpl implements StudentDAO { @Override public boolean addStudent(Student student) { // TODO Auto-generated method stub System.out.println("++++begin add student+++++"); //模拟add 操作 int flag =1; if(flag ==0) return false; else return true; } @Override public boolean delStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public boolean modifyStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public Student queryStudent(String StudentName) { // TODO Auto-generated method stub //模拟从数据库中查询学生名, 数据库中只有一名 name 为 Tom的学生 System.out.println("++++begin query student+++++"); if("Tom".equals(StudentName )) { Student studentTom = new Student(); studentTom.setName("Tom"); studentTom.setSex("male"); studentTom.setBirth("19701221"); return studentTom; } else return null; }}
package com.study.student.service;import com.study.dao.StudentDAO;import com.study.dao.impl.StudentDAOImpl;import com.study.entity.Student;/* * this class descripe StudentApi */public class StudentService { private StudentDAO studentDAO = new StudentDAOImpl(); public StudentDAO getStudentDAO() { return studentDAO; } public void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } public boolean addStudent(Student student) { return this.studentDAO.addStudent(student); } public String queryStudent(String studentName) { Student retStudent = this.studentDAO.queryStudent(studentName); if (null == retStudent) return "null"; else return retStudent.toString(); } public static void main(String[] args) { // create and publish an endpoint StudentService studentWs = new StudentService(); Student student1 = new Student(); student1.setName("Tom"); student1.setSex("male"); student1.setBirth("1970/05/08"); Student student2 = new Student(); student2.setName("Lili"); student2.setSex("female"); student2.setBirth("1972/05/23"); studentWs.addStudent(student1); studentWs.addStudent(student2); System.out.println(studentWs.queryStudent("Tom")); System.out.println(studentWs.queryStudent("LiLi")); }}
package com.study.spring.simulate;public interface BeanFactory { public Object getBean(String name);}ClassPathXmlApplicationContext.java 代码如下:
package com.study.spring.simulate;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;public class ClassPathXmlApplicationContext implements BeanFactory{ private Map这个类的主要逻辑是从xml文件中读取Bean,并提供返回Bean对象的功能。xml 文件 beans.xml 如下beans = new HashMap (); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sb=new SAXBuilder(); Document doc = sb.build( this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root= doc.getRootElement(); List list= root.getChildren("bean"); for( int i=0; i
package com.study.student.service;import static org.junit.Assert.*;import static org.hamcrest.Matchers.*;import org.junit.BeforeClass;import org.junit.Test;import com.study.dao.StudentDAO;import com.study.entity.Student;import com.study.spring.simulate.BeanFactory;import com.study.spring.simulate.ClassPathXmlApplicationContext;public class StudentServiceTest { public static StudentService studentService; public static StudentDAO studentDAO; //注意这里用beforeClass而不是before,表示全部测试函数调用前,调用一次 @BeforeClass public static void init() throws Exception{ BeanFactory factory = new ClassPathXmlApplicationContext(); studentService= new StudentService(); studentDAO= (StudentDAO)factory.getBean("u"); studentService.setStudentDAO(studentDAO); } @Test public void addStudentTest() throws Exception{ Student studentObj = new Student(); assertTrue(studentService.addStudent(studentObj)); } @Test public void queryStudentTest( ) throws Exception { assertThat(studentService.queryStudent("Tom"), is("Name=Tom;Sex=male;Birthday=19701221")); assertThat(studentService.queryStudent("Jerry"), is("null")); } }@BeforeClass 注解是测试函数调用前,初始化对象用的,在这里对StudentDAO 对象指定了实现类:studentDAO= (StudentDAO)factory.getBean("u"); 这里 id 为 “u” 的Bean ,根据配置文件是指定了StudentDAOImpl ,也就是说,如果有多个实现,通过配置文件就实现了动态指定实现类,大大增加了应用的灵活性。 这种能力,就是依赖注入,也成为IOC 控制反转。
package com.study.spring.simulate;import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;public class ClassPathXmlApplicationContext implements BeanFactory{ private Map修改beans.xml ,如下图beans = new HashMap (); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sb=new SAXBuilder(); Document doc = sb.build( this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root= doc.getRootElement(); List list=root.getChildren("bean"); for( int i=0; i ) element.getChildren("property") ){ String name = propertyElement.getAttributeValue("name"); String bean = propertyElement.getAttributeValue("bean"); Object beanObject = beans.get(bean); //这里组装set操作方法名,将参数中的bean取出来,进行set拼接 String methodName ="set"+name.substring(0,1).toUpperCase() + name.substring(1); System.out.println("method name ="+ methodName); //这里实现了动态装配,调用Method的invoke方法,用了java的反射机制 Method m=o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); m.invoke(o, beanObject); } } } public Object getBean(String name){ return beans.get(name); }}