- 博客(194)
- 收藏
- 关注
原创 在idea intellij中使用Sonarqube进行代码检查
Sonarqube是一个功能非常强大的代码质量检查、管理的工具。能够识别多种常用的编程语言,并能够通过设置不同的RuleSonar是一个代码质量管理的开源工具,它通过插件的形式能够识别常见的多种编程语言(例如Java, C#, PHP, Pythod等)代码质量问题。Sonar可以帮你分析出以下代码质量问题:1.不遵循代码标准2.潜在的缺陷3.代码重复4
2017-07-26 17:23:28
35552
2
原创 根据配置文件来切换不同服务的实现
在MicroService开发中经常会遇到一个问题,自己的服务需要调用其它小组的服务,但是其他小组的服务还没有完成。为了不耽误进度,我们就需要先实现一个Mock的服务,最后再切换到真正的外部服务上去。同时,一旦外部服务出现问题,为了不阻塞本地开发,我们需要很方便的切换到Mock服务上去。通过修改配置文件里面的内容,可以实现不修改代码来切换不同的服务。通用服务接口:pub
2017-07-19 17:18:16
579
原创 Spring Boot中@OneToMany与@ManyToOne几个需要注意的问题
@OneToMany如果不加@JoinColumn,系统会自动在主从表中增加一个中间表。主表:@Entity(name = "Post")public class Post { @Id @GeneratedValue private Long id; private String title; @OneToMany(
2017-07-19 16:45:15
1683
原创 Spring Boot的单元测试(Unit Test)
最近做了一些Spring Boot单元测试方面的东西,总结一下。单元测试尽量要和Spring Boot框架减少耦合度,当你在测试某一项功能点是需要mock太多的对象时你就应该意识到这个功能点的耦合度太高了
2017-07-19 14:56:55
7020
原创 Hybris安装Sample及遇到的一些问题
一. 解压的时候有可能会遇到错误信息“Cannot create total path and file name length must exceed 260 characters”,这是受到了目录长度的限制。两个解决办法:1.使用专业的解压工具。2.使用代码:jar -xvf 二. 安装可以使用Installer目录下面的Install.bat安装,就完全自动化安装,基本不需要人工干预。
2017-02-19 10:33:03
1373
原创 Review on Expert J2EE 1
J2EE Myths1. Portability; 过分强调可移植性,会失去一些平台所特有的能力,增大投入,降低生产力。应该是Design Once, Re-implement a Few Interface Anywhere.2. Performance: 不能依靠应用程序服务器和硬件来提高性能,在设计时就应该把性能因素考虑进去。3. Transparent:尽管应用程序服务器可以管理很多底
2006-09-12 11:58:00
1008
原创 Refactoring to Patterns Review 7
Replace Conditional Dispatcher with Command当使用条件语句,根据不同的条件执行不同的命令,这时可以为每一种命令创建一个Command,将Command存入集合中,然后将原有条件语句替换为从集合中取出Command并执行。并不是所有条件语句都需要这样做,在以下两个情况中可以考虑。1. 需要动态替换命令。2. 命令语句庞大,逻辑复杂。Extract A
2006-09-11 11:28:00
910
原创 Refactoring to Patterns Review 6
Move Accumulation to Collecting Parameter当在一个方法中运行一大堆代码对一个变量进行累加(例如字符串变量),可以将这个方法分解为多个易于理解的小方法(Compose Method),并给这些方法传入同一个Collection Paameter(例如StringBuilder)。Extract Composite当不同子类中实现了相同的Composite,
2006-09-11 11:15:00
921
原创 Book Review about Head First Design Pattern 9
State一个类的内部有不同的状态,在执行一些操作时,会根据当时所处的状态得到不同的结果(新的状态)。一般做法是在这些操作中使用if/switch语句,但是这样不利于以后代码的修改。使用State,创建一个Interface,定义公用的操作,根据不同状态创建相应的state子类,分别在子类中实现具体的操作。
2006-08-31 11:55:00
1008
原创 Book Review about Head First Design Pattern 8
Iterator在对象内部使用不同的Collection来存放对象,如果从外部直接访问collection,会导致几个问题产生:1. 不同的collection类型访问的方法不同2. 会暴露代码内部结构。Iterator建立一个公用接口,对collection进行统一的封装,通过相同的接口方法访问不同的collection.Principle 8:A class should have onl
2006-08-28 21:32:00
965
原创 Book Review about Head First Design Pattern 7
Template在Template的抽象基类中,一般可以分为三种方法。1. 声明为abstract的方法,需要子类来实现2. 各子类共有的代码,在基类中实现。一般为了防止子类override,可以把这种方法声明为final3. 被称为hook方法,在基类中什么也不做,或者是执行默认的动作,子类可以override.Template和Strategy的区别:Template定义了一个算法的一系列
2006-08-21 15:55:00
1015
原创 Book Review about Head First Design Pattern 6
CommandNull object: 在一些程序中,要针对对象是否为null做出判断,根据不同的结果作出不同的处理。但是一旦这样的情况比较多的时候,写出的程序就比较繁琐。这时可以为对象建立一个Null Object, 具有普通对象所有的方法,但是不进行任何操作,这样就可以对所有情况进行统一处理。Adapter分为object adapter, class adapter。Object Ada
2006-08-17 14:53:00
1001
原创 Book Review about Head First Design Pattern 5
在多线程的情况下有可能产生多个实例1. 使用synchronized关键字,但是这样有可能造成资源浪费并影响性能。2. 在static initializer中就初始化实例,但是这样在客户程序还没有要用到这个对象的时候就已经创建了对象实例,造成不必要的浪费3. 使volatile关键字,进行双重检查private volatile static Singleton instance;pub
2006-08-15 16:57:00
961
原创 Book Review about Head First Design Pattern 4
在代码中,有时会根据不同的条件创建不同的对象,一般是使用switch语句来做,这样当有了新的对象需要创建时,就要修改代码,违反了Closed for modification,尤其是当这种代码也会在其他地方使用的时候,会给修改带来麻烦。为解决这个问题,有时候会把这部分代码抽离出来单独放到一个类里面去,这就是Simple Factory.在Simple Factory里面用不用static方法来
2006-08-11 11:37:00
1131
原创 在C#隐藏主窗口的几种方法
写过一个程序,要求在程序启动的时候主窗口隐藏,只在系统托盘里显示一个图标。一直以来采用的方法都是设置窗口的ShowInTaskBar=false, WindowState=Minimized。但是偶然发现尽管这样的方法可以使主窗口隐藏不见,但是在用Alt+Tab的时候却可以看见这个程序的图标并把这个窗口显示出来。因此这种方法其实并不能满足要求。经过研究,又找到两个方法。方法一: 重写set
2006-08-10 16:21:00
18294
1
原创 Book Review about Head First Design Pattern 3
Principle 5:Classes should be open for extension, but closed for modification.Decorator Pattern: Concrete object 和 Decorator object 都继承至同一个基类,但是在Java中也可以通过Interface来实现。Decorator object的构造函数中必须有concr
2006-08-09 15:43:00
1085
原创 Book Review about Head First Design Pattern 2
Principle 4: Strive for loosely coupled designs between objects that interactObserver Pattern:关键是subject的数据怎样传递给Observer,是直接在方法参数中传递还是让Observer通过getter来取。如果数据少,通过参数传递比较方便,但是有可能每个Observer所需要的数据不一样,造成
2006-08-09 15:36:00
914
原创 Book Review about Head First Design Pattern
Inheritance的优缺点:可以代码重用。但是子类的行为可能不一致,甚至有些根本就不具有这种行为,这是就需要对每个子类的具体实现进行覆盖、修改。而且也不能动态对行为进行更换Interface的优缺点:灵活。但是代码不能重用Principle 1: Idnetify the aspects of your application that vary and separate them
2006-08-04 09:59:00
1019
原创 Refactoring to Patterns Review 5
Encapsulate Composite with Builder有时候创建Composite是一个重复的,复杂的,易出错的过程。使用Builder来简化这个过程,并降低客户与具体方法的耦合。例如创建DOMDocument, 如果不使用Builder, 以后在DOM版本升级的时候和产生很大的麻烦。 Replace Consturctor with Creation Method构造函数有几点
2006-07-10 16:21:00
1048
原创 Refactoring to Patterns Review 4
Replace Implicit Tree with Composit就像构造一个XML文档一样类似的树状结构,将节点抽象为类,在类中产生对应的字符串结构。Replace Conditional Logic with Strategy在一个方法中使用Conditional Logic来控制程序逻辑,使程序根据不同的条件进行不同的运算。为每一个变化的运算方式建立一个Strategy,委托Stra
2006-07-03 21:17:00
845
原创 Refactoring to Patterns Review 3
Compose Method当你不能快速的理解一个方法内的逻辑时,需要将逻辑转化为一些小的方法,而这些小方法的名字可以解释这段代码的目的,这样可以使代码易用、易读、易扩展。而一个Compose Method内的代码要控制一个同等的详细程度上。可能的问题:1. 可能产生大量销的方法,这时候可以考虑先采用Extract Class。2. 可能会给Debug带来麻烦。Form Templat
2006-07-03 21:01:00
793
原创 Refactoring to Patterns Review 2
2. Chain Constructors当一个类有多个构造函数而这些构造函数中具有重复的代码,这就有可能会产生一些问题。这时需要找出一个最通用的构造函数(catch-all constructor),然后使其他的构造函数调用这个通用函数来降低代码的重复性。3. Encapsulate Classes with Factory这个方法的目的好像和"Replace Constructor wit
2005-11-01 10:57:00
1042
原创 Principle 1: Your Potential Is Unlimited
If you believe you can do a thing, or you believe you cant, in either case, you are probably right.很多人成功都是因为他们能够抓住机会,但是为什么他们会在机会出现的时候能够抓住,而其他有些人却只能眼睁睁看着机会从眼前遛走。这是因为他们在机会出现之前就做好了准备。他们在机会出现之前就已经在考虑自己会成
2005-10-24 10:50:00
1050
原创 Create Your Own Future-Overview
个人的命运就像握在手中的小鸟一样,完全是由自己控制的。在这个社会中总有一些人是比大多数人成功的,而他们成功的原因,很多人却它归结为幸运-好的背景、正好碰上了很好的机会等等。其实,运气并不是成功的因素。Aristotle有一个理论"there is a reason for everything that happens, whether we know the law or principle b
2005-10-12 10:42:00
1052
原创 Over-Engineering & Under Engineering
Over-Engineering:无论是遇到一个多么小的问题,总是一开始就考虑一个非常灵活、复杂的解决方案。有些设计师认为自己对用户需求已经非常了解并且能够预料到以后会有一些什么样的改变,所以在设计结构时就考虑很多非常灵活的方式来适应以后的变化。但是有时候用户的要求并不是他们所想的那样,这些灵活的设计因此也就派不上用场,这样反而白白浪费的时间与人力,同时这些设计也无谓的增加了软件的复杂度。这种情况
2005-09-21 16:35:00
1545
原创 常用GUI组件 1
1. JListJList本身不支持滚动条,如果要加上滚动条,就要使用JScrollPane:JScrollPane scrollPane = new JScrollPane(wordList);JList采用的是MVC设计,虽然可以通过数组,Vector初始化一个JList,但是这样的List内容并不能动态的改变。要想动态改变List的内容,就必须得到它的Model:DefaultListMod
2005-09-14 13:39:00
1713
原创 RMI Review 2
客户端与服务器传递对象:在客户端与服务器之间可以传递的对象分两类,一类是Remote对象,另一类是Serializable对象,他们在处理过程中有些区别。Remote对象,他传送到客户端的时候只是一个stub,客户端实际上是通过这个stub来操作服务器端的具体对象;而Serializable对象传送到客户端是一个服务器端对象的拷贝,与服务器端对象没有了任何联系。RMI还提供一种方法可以让服务器端在
2005-09-09 16:32:00
677
原创 RMI Review 1
1.4和1.5在编译RMI的时候有些不同。1,4在编译的时候要产生一个stub文件,这个文件也要发布到客户端去;而1.5就没有这个文件了。RMI是一种基于借口的编程,也就是说当客户端要访问服务器的方法时,他并不能知道服务器类所提供的所有方法,它只能看见服务器类的接口所提供的方法。如果一个服务器类想让客户端使用它的方法,就必须在接口中声明,而这个接口必须继承Remote接口,所有的方法必须抛出Rem
2005-09-08 12:02:00
1118
原创 JDBC Review 2
6. 通过Metadata查询数据库信息有两种Metadata,一种是数据库的:DatabaseMetaData meta = conn.getMetaData();通过它可以查询一些数据库的信息,例如:ResultSet mrs = meta.getTables(null, null, null, new String[] { "TABLE" });另外一种是返回结果集的:ResultSet m
2005-09-07 11:25:00
832
原创 JDBC Review 1
JDBC Database URL:jdbc:subprotocol:other stuff例如URL for SQL Server:jdbc:microsoft:sqlserver://localhost:1433用jdbc连接数据库的步骤:1. 指定数据库Driver,其中又有三种方法a. 在命令行指定:java -Djdbc.drivers=com.microsoft.jdbc.sqlser
2005-09-05 11:27:00
746
原创 Collection Review 2
几种常用Collection:ArrayList An indexed sequence that grows and shrinks dynamically可以随机访问,但是如果要从中间删除一个对象会影响效率,因为有些未删除的对象要相应的调整位置。非线程安全,但效率会比Vector要高,如果在单线程下,选它而不是Vector。 LinkedList An ordered sequence tha
2005-09-02 16:46:00
961
原创 Collection Review 1
在5.0中,collection最大的一个改变就是可以指定它的具体类型:List list=new List;两个最基本的接口:public interface Collection{ boolean add(E element); Iterator iterator(); . . .}public interface Iterator{ E next(); boolean h
2005-09-01 17:31:00
1118
原创 线程回顾 4
10.在界面中使用多线程对于GUI设计来说,很重要的一个原则就是要及时的给用户反馈,就算是不能立即得到结果,界面也不能停在那里,是用户不知道发生了什么事情,必须让用户随时知道程序在坐什么。所以当程序要执行一段需要消耗比较长时间的操作时,就要使用多线程。但是,有些界面控件并不是线程安全的,在使用这些控件时就要特别注意。在API doc中这些都有注明,使用的时候就可以查一下。如果想在自己另外所创建的线
2005-08-31 16:10:00
754
原创 线程回顾 3
8. Callables and Futures实现多线程时一般用的是Runnable接口,但是他有一个问题就是他没有参数和返回值,所以当执行一个线程需要返回一个值的时候就不是很方便了。Callable接口和Runnable差不多,但是他提供了参数和返回值:public interface Callable{ V call() throws Exception;}而Future接口可以保留异步
2005-08-30 15:13:00
804
原创 线程回顾 2
7.Synchronization多线程很重要的一个问题就是同步的问题,如果不解决好同步的问题一个是可能会引起数据的混乱,而且还有可能造成线程的死锁。在Java 5.0之前,用synchronized来解决这个问题,在5.0中加入了一个新的类:ReentrantLock使用lock的基本形式是:myLock.lock(); // a ReentrantLock objecttry{ criti
2005-08-29 16:18:00
794
原创 线程回顾 1
1.创建线程在java中实现多线程有两种方法,一个是直接继承Thread类,一个是实现Runnable接口,但是推荐的是第二种。因为在逻辑上应该要把一个线程要做的事情以及做这个事情的方法分开;对于Thread来讲,它只负责线程的操作,而具体要做的事情就应该放在Runnable中。但不管是那种方式,都要实现public void run()方法,但启动线程用start而不是run。2.终止线程在1.
2005-08-24 12:34:00
1209
原创 不能忽略细节问题
现在发现自己有一个很大的问题,经常对一些细节问题不太重视,总是认为这些小问题不需要多注意,到要用的时候再来翻书查也是一样。但是后来发现如果不注意这些小问题,很有可能会造成概念不清晰,而且平时忽略了细节,到了具体要用到的时候也并不一定就能反应过来,容易因为一些小地方的不严谨造成一些大问题。所以我决定抽时间再次重温最基础的书籍,并把细节问题记录下来,而且还要做一些横向、纵向的比较。争取能全面、细致彻底
2005-08-23 11:34:00
1269
原创 Re: A question when reading ......
这个问题终于被解决了。在调用RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/Test.jsp"); dispatcher.include(request, response);语句的时候,dispatcher并没有真正的转向到web serv
2005-08-23 11:06:00
756
原创 A question when reading Test Driven Development - A J2EE Example
在第四章,介绍用httpunit和serveletunit测试Servelet和jsp时,运行自己写的程序和例子的时候总是要遇到一个错误,出现在:RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/Test.jsp"); dispatcher.include(requ
2005-08-19 10:45:00
724
原创 Serialization in C#
在C#中创建新的类型时最好让这个类型支持序列化,尤其是你的这个类型要提供给别的程序员使用的时候。而在C#中使你的类型支持序列化是非常简单的事情,使用[Serializable]属性就可以了:[Serializable]public class MyType{ private string _label; private int _value;}当你的类中的成员变量是基本类型时,他们自动支持序列
2005-07-01 15:43:00
2238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人