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中怎么做?
- 9月5日培训日记
- 9月9日培训日记
- 9月2日培训日记
- 9月3日培训日记
- 9月4日培训日记
- 9月7日培训日记
- 9月8日培训日记
- 9月10日培训日记
- 9月11日培训日记
- 9月12日培训日记
- 9月14日培训日记
- 9月15日培训日记
- 9月16日培训日记
- 9月17日培训日记
- 9月18日培训日记
- 9月19日培训日记
- 9月21日培训日记
- 9月23日培训日记
- 思维转向 - 8个经典问题
- Spring 的好英文原版读物
- JAVA面试题集(1)
- 关于封装
- SQL备份并压缩备份文件
- 9月5日培训日记
- java中文问题的根本解决之道
- 清除SQLServer日志的方法
- 别说我对你不好。
- Hibernate的检索策略
- 质疑南水北调 中国专家呼吁慎重
- 获取机器的硬件信息
- 如何使用Microsoft .NET保护应用程序和数据的安全
- delphi中使用指针优化程序性能