工厂模式
//工厂模式我的理解
//第一次调用没有实例化的对象时 会去内存中查找(栈)
//如果没有找到,就去xml配置中查找className和他相同的类名
//找到的话就让工厂进行实例化,初始化对象
//没找到的话就空指针异常
公产模式就是ioc(inversion of control) 和hibernate的控制反转有点像 就是把自身不维护关系,交给别人来维护关系
dao层,service层在编码时只声明对象,而把实例化对象的权利交给工厂,工厂通过配置文件来配置类(对象)的信息,
然后由框架(虚拟机)来自动实例化对象,当然工厂采用的是单例模式,当该对象被实例化一次后,下次调用就直接获取(内存中反射?静态成员变量?)
通过dom4j和xpath以及反射技术来模拟beanfactory的getBean("stu1")方法
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="stu1" className="cn.itcast.domain.Student"> <property name="number" value="ITCAST_1001"/> <property name="name" value="zhangSan"/> <property name="age" value="29"/> <property name="sex" value="male"/> <!-- <property name="teacher" ref="t1"/>ref的值必须是另一个been的id --> </bean> <bean id="stu2" className="cn.itcast.domain.Student"> <property name="number" value="ITCAST_1002"/> <property name="name" value="wangWu"/> <property name="age" value="94"/> <property name="sex" value="female"/> <property name="teacher" ref="t1"/><!-- ref的值必须是另一个been的id --> </bean> <bean id="t1" className="cn.itcast.domain.Teacher"> <property name="tid" value="TEACHER_2001" /> <property name="name" value="liSi" /> <property name="salary" value="123.456" /> </bean> <bean id="stuDao" className="cn.itcast.dao.impl.StudentImpl2"> </bean> <bean id="stuService" className="cn.itcast.service.impl.StudentServiceImpl"> <property name="studentDao" ref="stuDao"/> </bean> </beans>
给定字符串"stu1"
1.Document document = reader.read(this.getClass().getResourceAsStream("/beans.xml"));
//获取类路径下的文件 是相对于class文件夹下的 加"/"是从bin javaweb是从class文件夹下
//classPath 存放class(字节码)的总文件夹
2.dom4j的一些方法
Element root = document.getRootElement();
Node是父类 Attribute,Element是子类 可以相互转换
Element.elements() 获取子节点
Attribute.attributes()获取所有属性
Attribute.getName()获取属性name
Attribute.getValue()获取属性value
Attribute.attributeValue("xx")获取属性xx的value
document.selectNodes(xpath)查找满足xpath表达式的所有节点集合
document.selectSingleNode(xpath)获取满足xpath的单个节点
反射的一些知识
getField(xx):获取public成员
getDecalreField(xx)获取所有成员
classForName只能加载类(引用)类型的 ,不能加载基本数据类型的
获取成员变量的数据类型
Field f=clazz.getDeclaredField(e.attributeValue("name"));
// System.out.println(f.getName()+f.getType().getName());
获取方法的参数类型
public static Class[] getMethodParamTypes(Object classInstance, String methodName) throws ClassNotFoundException{ Class[] paramTypes = null; Method[] methods = classInstance.getClass().getMethods();//全部方法 for (int i = 0; i< methods.length; i++) { if(methodName.equals(methods[i].getName())){//和传入方法名匹配 Class[] params = methods[i].getParameterTypes(); paramTypes = new Class[ params.length] ; for (int j = 0; j < params.length; j++) { paramTypes[j] = Class.forName(params[j].getName()); } break; } } return paramTypes; }
字符串首字母大写
public static String captureName(String name) { // name = name.substring(0, 1).toUpperCase() + name.substring(1); // return name; char[] cs=name.toCharArray(); cs[0]-=32; return String.valueOf(cs); }