发表于: 2017-09-03 22:29:08
6 968
一、 今天完成的事情
任务小结、深度思考(部分)
1) 任务小结
今天是做任务的第七天,就任务步骤来说,已经全部完成了,这里我做一下任务小结。
第一天) 步骤1-10:
因为之前学过Java基础,这里对于我来说难度很低,所以一口气完成到10,不得不说这里最大的收获是步骤5中,要求的create_at、update_at字段以及设置为整数类型的要求!!!
第二天) 步骤11-16:
这一块完成深度思考中mysql的部分,里面的问题很经典,非常值得反复琢磨,有些问题即便我查阅到了答案自我感觉仍难以完全领会,可能是缺乏开发经验;此外,这里开始接触强大的项目管理工具——maven,确实是很方便,尽管目前我只会用来引入依赖
第三天) 步骤17-19
到这里,第一个难关出现了。使用spring和mybatis两种框架实现jdbc的基本操作。这里总算有点明白了之前Java基础中学的反射,xml文件的作用。这里学会了有:spring中通过ClassPathXmlApplicationContext()类的构造方法读取spring配置文件来获取一个容器,再由容器获取指定的bean从而得到bean对应的类实例;再如借助JdbcTemplate类操作sql语句;还有mybatis中将sql语句放入mapper文件操作数据库的方式,借助SqlSession对象实例直接获取dao(接口)的实例。到此算是结束,但又只是开始。
尽管已经知道如何去操作,但仍然对着两个框架有很大的疑惑。结合师兄的意见,总结原因如下:
① 代码量不足。这是师兄告诉我的,我也很赞同这点,以前学C语言遇到看不懂的题解就拼命多敲几次,时间久了就懂了。
② 不懂其实现原理。给我一种就只是疯狂调用API的感觉,很不舒服,这需要我系统去学习框架。
③ Java基础知识不牢固。Spring和Mybatis的实现肯定用到了反射机制,xml基础知识,此外spring还用到动态代理…(暂且知道这么多,泪崩,好多都忘了)
第四天) 步骤20-21
这里学到了单元测试Junit和日志。Junit方面暂时没体会到它的好处。说下日志,尝试使用了log4j和log4j2,在师兄的建议下了解了slf4j,logback等。
这里有个疑问:是不是每次使用log4j将当前的报错写到日志中去,都要在当前代码中获取logger对象,并调用相应的方法,如logger.info(),logger.error() ?
第五天) 步骤22-23
这里又是一个难关,不过却也有趣。一上来我就是懵逼的,还好后来接触师兄的日报还有其它师兄的,才弄懂。这里学会了linux系统的基本操作,在linux系统上安装数据库server和client,jdk,maven,和做maven项目的单元测试
第六天) 步骤24-28
这里主要是在linux上跑项目,熟悉linux操作。此外我还安装了tomcat
2) 深度思考
1) Q1、maven是什么,和Ant有什么区别?
首先明确一下概念:
Maven是软件项目管理工具和理解工具。
Ant是软件构建工具。
好吧,从概念上貌似看不出什么,那看看功能方面。
Maven具备Ant的功能,Ant的脚本可以直接运行在Maven中,此外还有Maven还有以下几个主要的功能:
使用Project Object Model来对软件项目管理;
内置更多隐式规则;
内置依赖管理和Repository来实现依赖的管理和同一存储;
内置了软件构建的生命周期(clean、default、site);
2) Q2、clean,install,package,deploy分别代表什么含义?
Clean:清理,可以上一次编译产生的target文件移除,防止上一次构建的输出影响本次构建。
Install:安装,将项目打包成jar安置到本地仓库。
Package:打包,将项目打包成jar,一般在target目录下。
Deploy:部署,将打包的项目上传到远程仓库与他人共享
3) Q3、怎么样能让Maven跳过JUnit?
即:打包的时候跳过junit
方法一:命令行下使用命令:mvn install -Dmaven.test.skip=true
方法二:修改pom.xml,在build选项加上plugins的这段如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
4) Q4、为什么要用Log4j来替代System.out.println?
① 打日志的意义:
开发中记录日志可以作为日后处理问题的一个追溯,方便根据日志来统计查询解决问题。
② Log4j的特点:
能够自由控制日志信息输出位置、输出格式、输出内容
③ 对比System.out.println,log4j:
日志信息可分级;
可生成文件,特别是多数情况下项目运行时是看不到控制台的输出内容的。
不需要控制台输出时,Log4j可通过配置文件快速更改,而System.out.println需要一行一行注释代码
④
5) Q17、为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
① 接口的作用总结是:降低耦合度,提高扩展性;
场景一:降低耦合度
当团队进行项目开发的时候,将项目进行分三层,表示层、业务层、数据访问层,由A、B、C三人分别负责。
A开始写代码,需要用到业务层中的方法,但B还在等C完成数据访问层的代码实现。
这时候,问题来了,难道开发流程必须依次等待吗?
所以接口出现了,直接定义一套service层和dao层的规范,A和B就可以进行开发了,接口降低了层与层之间的密切程度,提高开发效率。
场景二:提高扩展性
Java中有一个序列化接口Serializable,作为一个标志使类可以序列化到磁盘。(没有实现此接口的类无法序列化)
现有如下代码:
public class Person { … }
Person p1 = new Person();
Person p2 = new Person();
我们希望将p1,p2两个人的信息存储到磁盘。
方式一:将p1和p2的信息逐一存储。显然,效率太低
方式二:自己实现序列化算法。难度大,且不通用,难道每个需要序列化的类都来实现一次序列化算法。
方式三:实现Serializable接口。
这里,接口体现了它拓展功能的作用
② 面向接口编程,方便更换实现。(目前只体会到这点)
隐藏实现细节,减少对外接口和类。
封装,高内聚
3) 练习Mybatis和c3p0连接池
分别写了两个小项目作为练习(以下不展示代码)
二、 明天计划的事情
1) 继续做深度思考
2) 学习linux系统
三、 遇到的问题
1) 任务小结时想到的,是不是每次使用log4j将当前的报错写到日志中去,都要在当前代码中获取logger对象,并调用相应的方法,如logger.info(),logger.error() ? 我想表达的是能不能让它自动记录到日志?
2) 今天师兄教我的那个解答问题的模式套用不起来,有什么示例可以学习吗?
四、 收获
1) 和师兄的交流,学到以一种特定的思路解答深度思考的问题
2) 回顾这七天学到的内容,温故知新
3) 做深度思考,感觉每个问题都很经典,值得研究
评论