什么是工厂模式,编写一个例子程序来说明:从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中怎么做?
分享到:
相关推荐
2. **表格生效日期**:2005年2月1日,这是施工日记开始使用的日期,也可能是工程开始的时间点。从这个日期起,所有与工程相关的重要活动和变更都应在此日记中记录。 3. **序号**:用于区分每天的施工记录,方便按...
【电子商务实习日记】这篇文档记录了作者在2014年2月至3月期间在西安西木电子科技有限公司实习的经历,这家公司主要通过阿里巴巴和淘宝平台进行销售。以下是从日记中提炼出的相关知识点: 1. **电子商务运营基础**...
1. **时间的价值**:张一鸣在2011年9月10日的微博中强烈建议年轻人应当重视时间的价值,尽可能地节省时间用于更有意义的事情。 2. **加入创业公司的优势**:他指出加入一家优秀的早期公司对于个人成长非常有利,因为...
9. **安全日记**:记录安全员每天的工作,包括检查、验收、职工行为和上级检查等情况,用于追踪和改进安全管理。 10. **工伤事故处理**:要求项目部每月报告安全生产情况,即使无事故也需要记录,以备查阅。 11. *...
日记帐信息层次结构则帮助组织和管理凭证的详细信息,包括日记帐批、日记帐头和日记帐行,每部分都有其特定的作用和内容。 在实际操作中,财务人员需要熟悉以上各项功能,以确保总帐模块的高效运行。通过培训,财务...
8. 自我反思与成长:教师持续记录工作和生活的感悟,形成培训日记,这有助于提升教师的专业素养和教育理想。 9. 未来规划:回到原工作岗位后,教师需要继续思考和努力,巩固和拓展支教期间的经验,为今后的教学工作...
文档“安全监理台帐培训资料全.doc”是关于建设工程安全监理的重要参考资料,包含了多个关键环节的安全管理和监控要点。以下是对其中涉及的知识点的详细说明: 1. **项目委托监理合同**:这是监理工作的基础,明确...
9. **HR面试**: 人力资源面试更关注个人素质和公司文化的匹配,包括自我介绍、期望的工作时间、薪资待遇以及公司提供的培训计划。 10. **自学能力**: 自学Python和爬虫四个月即找到实习工作,体现了较强的自学能力...
2. **试用期管理**:新业务员需携带相关证件参加岗前培训,通过培训后才能正式上岗。试用期通常为几个月,期间会综合评估责任心、业务能力和对公司贡献来决定转正时间。 3. **保密规定**:业务员必须对企业忠诚,...
实习内容 3 2.1用友U8产品的学习 3 2.1.1软件应用领域 4 2.1.2用友ERP-U8应用的系统运行环境: 5 2.1.3用友ERP-U8的系统安装 6 2.2用友公司结构 9 3实习心得 10 4 实习日记 10 参考文献 12 5 附录: 12 (二)用友...
1. **九月迎新季** - **迎接20xx级新生**:与学院教师和学生组织协作,规划迎新活动,包括时间安排、人力分配和所需物资准备,同时安排团委干部帮助新生适应新环境。 - **三会下寝宣传**:通过团委干部和学生组织...
**时间安排**:实习通常在大四期间进行,如2009年12月7日至2010年4月9日,随后于4月12日返校。 **先修课程**:涵盖大一至大四的所有课程,确保学生具备全面的专业知识基础。 **实习要求**: 1. 遵守实习时间和...
5. 四育并举:学校实施的“礼仪”、“感恩”、“责任”、“卫生”四大培训,目的是提升学生的综合素质,塑造良好的校风和道德素质。 6. 每期一事:结合“每月一事”的理念,学校组织各类活动,如趣味运动会、感恩...
- **示例活动**:XX年4月3日的“教师支持服务体系”项目导师团队首次集中培训,主题为“如何了解教师真实的需求”。 - **撰写简报与日记**: - 记录项目进展与成果,便于内部交流与外部宣传。 - **示例简报**:...
5. 文件更改通知书:通知相关人员文件有更新,确保所有人在使用最新版文件。 6. 计算机登记表:登记公司电脑等硬件设备,便于资产管理和维护。 7. 收文(图)登记表:记录收到的文件和图纸,确保信息不丢失。 8. ...
提供完备的帐务系统,月记帐、日记帐,提供多种综合查询及统计报表功能、软件提供多种日报表、月报表,软件提供庞大的图表分析系统及库存、经营报警系统,多方位为企业经营决策提供服务。 14.安全可靠的数据库备份...
根据给定文件“参考资料-9-7电气工程施工监理.doc”的内容,本文将详细解析其中涉及的关键知识点,主要包括电气工程施工监理程序的目的、适用范围、引用文件、职责分配、资格与培训要求,以及各施工阶段的监理依据、...
9. **安全日记**:安全员每天记录施工现场的安全状况,包括查检、验收、职工行为和上级检查的情况,形成完整记录。 10. **工伤事故处理**:项目部需要定期报告安全月报表,即使无事故也要记录,确保及时上报伤亡...
6. 培训与发展:通过培训记录跟踪员工的学习进度和效果,提高团队的专业技能。 7. 销售报告与货品管理:周报告、月报告、总结报告以及货品盘存核对,帮助店长掌握销售状况,及时调整库存,确保货品流动的顺畅。 8....