9月5日培训日记

来源:互联网 发布:阿里云服务器换ip 编辑:程序博客网 时间:2024/04/28 10:18

什么是工厂模式,编写一个例子程序来说明:从CLASSPATH根目录读取某个Properties文件、根据文件中的信息创建一个集合对象和为集合对象设置元素。
collection.properties文件:

class=java.util.ArrayList
elements=zxx,flx,zt
-----------------------------------
CollectionFactory.java文件:

package cn.itcast;

import java.util.*;
import java.io.*;

public class CollectionFactory
{
 public static String KEY_PROPERTIES_FILE = "cn.itcast.collectionfile";
 public static String KEY_CLASS = "class";
 public static String KEY_ELEMENTS = "elements";
  
 public static Collection getCollection() throws Exception
 {
  String properties_file = System.getProperty(KEY_PROPERTIES_FILE);
  if(properties_file == null)
  {
   throw new IllegalArgumentException("not found property file!");
  }
  
  InputStream ips = CollectionFactory.class.getResourceAsStream("/" + properties_file);
  if(ips == null)
  {
   throw new IllegalArgumentException("file not exists!");   
  }
  
  Properties props = new Properties();
  props.load(ips);
  ips.close();
  
  String strClassName = props.getProperty(KEY_CLASS);
  Class classCollection = Class.forName(strClassName);
  Collection objCollection = (Collection) classCollection.newInstance();
  
  String strElements = props.getProperty(KEY_ELEMENTS);
  String [] elements = strElements.split(",");
  for(String element : elements)
  {
   objCollection.add(element);
  }
  
  return objCollection;
 }
}
----------------------------------------------------------------
MainClass.java文件:

package cn.itcast;

import java.util.*;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;

public class MainClass
{
 public static void main(String [] args) throws Exception
 {
  Log log = LogFactory.getLog(MainClass.class);
  Collection objCollection = CollectionFactory.getCollection();
  for(Object obj : objCollection)
  {
     log.info(obj.toString());
  }
 }
}

-------------------------------------------------------------------------
明白工厂模式之后,开始spring之旅:
什么是IOC(比较:我写的方法去找容器和我写一个方法等着容器来找),什么是DI,转换编程思想,把自己变成一个衣来伸手、饭来张口之人,一个Bean类是被容器创建的,它所要依赖和引用的其他资源对象等着容器给它传递进来,例如,一个学生所需要的自行车,水杯,书包,文具盒都等着创建它的容器传递进来。容器把一个学生的相关信息给装配起来,学生依赖的资源通过配置文件设置,这使得系统很灵活,如果要更换学生的水杯类型,只需修改配置文件,即将依赖耦合转移到了配置文件中。
第一个例子程序(跑通这个程序除了要spring.jar外,还需要用到commons-logging.jar)
applicationcontext.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
 <bean id="zs" class="cn.itcast.Student">
  <property name="myName">
   <value>flx</value>
   <!--List>
    <value>xx</value>
    <value>yy</value>
   <List-->
   <!--set>
    <value>xx</value>
    <value>yy</value>
   </set-->
   <!--map>
    <entry key="xx"><value>ddd</value></entry>
    <entry key="yy"><value>zzz</value></entry>
   </map-->
   <!--props>
    <prop key="xx">ddd</prop>
    <prop key="yy">zzz</prop>
   </props-->
   <!--ref bean=""></ref-->
   <!--bean></bean-->
  </property>
 </bean>
</beans>
-----------------------------------------------------------------------
MainClass.java文件:
package cn.itcast;

import java.util.*;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.springframework.core.io.ClassPathResource;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.beans.factory.BeanFactory;

public class MainClass
{
 public static void main(String [] args) throws Exception
 {
  Log log = LogFactory.getLog(MainClass.class);
  BeanFactory bf = new XmlBeanFactory(new ClassPathResource("/applicationcontext.xml"));
  Object obj = bf.getBean("zs");
  log.info(obj.toString() + ":" + obj.getClass().getName());
  
 }
}
-------------------------------------------------------------------------
student.java文件:
package cn.itcast;

public class Student
{
 private String name = null;
 public void setMyName(String name)
 {
  this.name = name;
 }
 
 public String getMyName()
 {
  return name;
 }
 
 public String toString()
 {
  return name;
 }
}
-----------------------------------------------------------------------

一个Bean的属性由get和set方法决定,bean内部的成员变量只是用于记录Bean属性的值,不一定要与Bean属性同名,但是,我们有什么理由不让它们同名呢?
除了可以使用<ref bean="">元素引用一个bean外,也可以用ref属性引用bean。

FactoryBean是一种特殊的Bean,它是用于产生其他Bean的Bean,它是用作产生其他Bean的工厂的一种Bean。下面是有关FactroyBean的一个例子程序。

MyFactoryBean.java文件:
package cn.itcast;

import java.lang.reflect.Proxy;

import org.springframework.beans.factory.FactoryBean;

public class MyFactoryBean implements FactoryBean {

 private String target = null;
 private String myInterface = null;
 public Object getObject() throws Exception {
  // TODO Auto-generated method stub
  Class [] clazzes = new Class[]{Class.forName(myInterface)};
  Class clazz = Class.forName(target);
  Object objTarget = clazz.newInstance();

  Object objProxy = Proxy.newProxyInstance(this.getClass().getClassLoader(),clazzes,new MyInvocationHandler(objTarget));
  return objProxy;
  //return null;
 }

 public Class getObjectType() {
  // TODO Auto-generated method stub
  return null;
 }

 public boolean isSingleton() {
  // TODO Auto-generated method stub
  return false;
 }

 public String getTarget() {
  return target;
 }

 public void setTarget(String target) {
  this.target = target;
 }

 public String getMyInterface() {
  return myInterface;
 }

 public void setMyInterface(String myInterface) {
  this.myInterface = myInterface;
 }

}
---------------------------------------------------------
MyInvocationHandler.java文件:
package cn.itcast;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import org.apache.commons.logging.LogFactory;

public class MyInvocationHandler implements InvocationHandler {

 private Object objTarget = null;
 public MyInvocationHandler(Object objTarget) {
  super();
  // TODO Auto-generated constructor stub
  this.objTarget = objTarget;
 }

 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  // TODO Auto-generated method stubs
  LogFactory.getLog(this.getClass()).info(method.getName() + " is calling!");
  Object objValue = method.invoke(objTarget,args);
  return objValue;
 }

}
-------------------------------------------------------------------
applicationContext.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
 <bean id="myfactorybean" class="cn.itcast.MyFactoryBean">
  <property name="target">
   <value>java.util.Vector</value>
  </property>
  <property name="myInterface">
   <value>java.util.Collection</value>
  </property>
 </bean>

</beans>


由于Collection接口中定义的add方法有返回值,所以动态生成的代理类的add方法也需要返回一个非null值,大家都还不明白这个动态生成的代理类的add方法的返回值就是MyInvocationHandler.invoke方法的返回值。
InvocationHandler.invoke方法的返回值通常是怎样得到的,它将被用在哪?如果我们在MyInvocationHandler.invoke方法中返回null,那么代理类的add方法将对此进行检查,并抛出如下异常信息。
add is calling!
Exception in thread "main" java.lang.NullPointerException
 at $Proxy0.add(Unknown Source)
 at cn.itcast.MainClass.main(MainClass.java:30)
如果方法返回的类型为String,那么,即使invoke返回null,也不报错,这就是说只要返回类型是对象,就不会出问题,看来错误的原因就是基本类型数据需要从invoke方法的返回值进行转换,所以,会报告异常。


怎样利用myeclipse为我们的项目增加spring功能,怎样让commons logging不要找log4j。怎样关闭spring输出的日志信息。一个logger对象的直接父代是谁,不是由程序中的getLogger()方法决定的,而是由配置文件中的配置信息决定的,Log4j的根logger对象的默认级别是debug。

log4j中的appender和layout的属性名的首字母都是大写,这算不算一个设计失误?

小知识
1。在用eclipse编写spring的配置文件时,eclipse还能自动填写元素的属性值。

作业:
1。请口头详细描述getBean方法的执行过程。

晚上陈刚老师为大家继续讲解UML与OOAD,大概内容:
用例的基本流程和备用流程的描述是面向用户的,不描述后台是如何工作,它用于把软件的使用过程完整地描述出来,要求以用户的视角来描述用例。
用例是表面的流程,时序图是类的执行流程,一个用例对应一个时序图。
需求分析最佳实践:用例图(章),用户故事或主要用例(节),界面原型(草稿)。
类之间的关系:依赖,关联。聚合(Aggregation)和组合(composition)是关联的细化。
边界类,实体类,控制类的表示方法。

设计文档:整个软件的说明,软件的构架图,各个模块的功能说明。总之,就是要让人明白软件怎么设计的。
类图:抽象类名用斜体。~表示友元,#表示protected,-表示私有,+表示公有。
类图不能过于复杂,先表示出主要的类。应逐步细节,层层推进。
CRC卡片相当于类图,角色扮演相当于时序列图。每一个动作问哪个卡片能完成。
类图分包,不同包的类存储在不同包下面,这在jude中怎么做?