1. 程式人生 > >工廠模式 ioc dom4j 反射之我的一點理解

工廠模式 ioc dom4j 反射之我的一點理解

nat Coding println hibernate return 控制反轉 加載 light 異常

工廠模式

//工廠模式我的理解
//第一次調用沒有實例化的對象時 會去內存中查找(棧)
//如果沒有找到,就去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);

	}

  

工廠模式 ioc dom4j 反射之我的一點理解