9月5日培训日记

什么是工厂模式,编写一个例子程序来说明:从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中怎么做?

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
先看效果: https://pan.quark.cn/s/aceef06006d4 OJBetter OJBetter 是一个 Tampermonkey 脚本项目,旨在提升你在各个在线评测系统(Online Judge, OJ)网站的使用体验。 通过添加多项实用功能,改善网站界面和用户交互,使你的编程竞赛之旅更加高效、便捷。 ----- 简体中文 ----- 安装 主要功能 安装脚本,你可以获得: 黑暗模式支持:为网站添加黑暗模式,夜晚刷题不伤眼。 网站本地化:将网站的主要文本替换成你选择的语言。 题目翻译:一键翻译题目为目标语言,同时确保不破坏 LaTeX 公式。 Clist Rating 分数:显示题目的 Clist Rating 分数数据。 快捷跳转:一键跳转到该题在洛谷、VJudge 的对应页面。 代码编辑器:在题目页下方集成 Monaco 代码编辑器,支持自动保存、快捷提交、在线测试运行等功能。 一些其他小功能…… [!NOTE] 点击 网页右上角 的 按钮,即可打开设置面板, 绝大部分功能均提供了帮助文本,鼠标悬浮在 ”? 图标“ 上即可查看。 使用文档 了解更多详细信息和使用指南,请访问 Wiki 页面。 如何贡献 如果你有任何想法或功能请求,欢迎通过 Pull Requests 或 Issues 与我们分享。 改善翻译质量 项目的非中文版本主要通过机器翻译(Deepl & Google)完成,托管在 Crowdin 上。 如果你愿意帮助改进翻译,使其更准确、自然,请访问 Crowdin 项目页面 贡献你的力量。 支持其他OJ? 由于作者精力有限,并不会维护太多的类似脚本, 如果你有兴趣将此脚本适配到其他在线评测系统,非常欢迎,你只需要遵守 GP...
企业微信私域流量管理系统是一套基于Go语言和React框架开发的高质量企业级客户关系管理解决方案,专门用于企业微信生态下的私域流量运营与管理。该系统遵守Apache2.0开源协议,支持免费商用,为企业提供了一套完整、高效且成本可控的私域流量管理工具。 系统采用现代化的技术架构,后端使用Go语言开发,确保了高性能和高并发处理能力;前端采用React框架,提供了流畅的用户交互体验。数据库方面,系统使用MySQL进行结构化数据存储,Redis用于缓存和会话管理,有效提升了系统的响应速度和数据处理效率。此外,系统支持Docker容器化部署,简化了部署和维护流程,提高了系统的可移植性和扩展性。 在架构设计上,系统融合了MVC(模型-视图-控制器)模式、分层架构和事件驱动架构,确保了代码的清晰结构和模块化设计。同时,系统应用了多种设计模式,如单例模式、工厂模式和观察者模式,增强了系统的可维护性和可扩展性。这些技术特点使得系统不仅适用于毕业设计项目,还能满足实际企业应用的需求。 系统的主要功能包括企业微信集成、客户管理、营销活动管理、数据分析与报表生成等。通过企业微信接口,系统能够无缝对接企业微信平台,实现客户信息的自动同步、消息推送、群发管理等功能。客户管理模块支持客户标签、分组、跟进记录等操作,帮助企业精细化运营私域流量。营销活动模块提供了活动创建、执行、监控和效果分析的全流程管理,助力企业提升营销效率。数据分析模块则通过可视化报表展示客户行为、活动效果等关键指标,为企业决策提供数据支持。 应用场景广泛,适用于各类需要进行私域流量运营的企业,如电商、教育、金融、零售等行业。无论是初创公司还是大型企业,都可以通过该系统低成本地搭建自己的私域流量管理体系,提升客户粘性和转化率。系统的高质量和免费商用特性,使其成为毕业设计项目的理想选择,学生可以通过学习和实践该系统,掌握Go、Re
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值