??xml version="1.0" encoding="utf-8" standalone="yes"?> Master Java 5.0 and TDD Together: Build More Robust, Professional Software Master Java 5.0, object-oriented design, and Test-Driven Development (TDD) by learning them together. Agile Java weaves all three into a single coherent approach to building professional, robust software systems. Jeff Langr shows exactly how Java and TDD integrate throughout the entire development lifecycle, helping you leverage today's fastest, most efficient development techniques from the very outset. Langr writes for every programmer, even those with little or no experience with Java, object-oriented development, or agile methods. He shows how to translate oral requirements into practical tests, and then how to use those tests to create reliable, high-performance Java code that solves real problems. Agile Java doesn't just teach the core features of the Java language: it presents coded test examples for each of them. This TDD-centered approach doesn't just lead to better code: it provides powerful feedback that will help you learn Java far more rapidly. The use of TDD as a learning mechanism is a landmark departure from conventional teaching techniques. Presents an expert overview of TDD and agile programming techniques from the Java developer's perspective Brings together practical best practices for Java, TDD, and OO design Walks through setting up Java 5.0 and writing your first program Covers all the basics, including strings, packages, and more Simplifies object-oriented concepts, including classes, interfaces, polymorphism, and inheritance Contains detailed chapters on exceptions and logging, math, I/O, reflection, multithreading, and Swing Offers seamlessly-integrated explanations of Java 5.0's key innovations, from generics to annotations Shows how TDD impacts system design, and vice versa Complements any agile or traditional methodology, including Extreme Programming (XP)
]]>
E文不太难,一般都应该可以看懂Qؓ什么好书都是老外写的呢?
我想把书传上来,但是.TextҎ件的大小好象是有限制Q书的名字叫
Agile Java Crafting Code with Test-Driven DevelopmentQ想要的同学可以留下EMAIL
]]>。现在好了,?a id="Header1_MyLinks1_HomeLink" >博客?/font>扑ֈ了一个关?span lang="EN-US">Castle?/font>pd文章Q先收藏个连接,51在休息的I隙Q还可以抽出Ҏ间好好研I好东东Q?img height="19" src="http://www.aygfsteel.com/Emoticons/regular_smile.gif" width="19" border="0" />?br />http://www.cnblogs.com/Terrylee/archive/2006/04/28/387503.html
]]>
学习设计模式也有D|间了Q很早也见过 Proxy 模式的,记得最开始接?/span> Proxy 模式q是在著名的 JIVE 论坛Q?/span> JIVE 中用 Proxy 来做权限控制Q。今天算是一遍复习吧?/span>
对复杂的软gpȝQh们常常用的一U处理手法是在系l增加一层间接层Q得到对pȝ灉|的、满特D要求的解决Ҏ?/span>
使用 Proxy 模式的动机:?/span> OO 的开发过E中Q某些对象的开销很大Q如Q?/span> new 的开销大、某些对象因为安全的原因不能被客L接的调用{)Q如果直接操作这些对象会破坏pȝl构。那么,我们q代理对象来控制对象的讉K?/span>
例子Q?span style="FONT: 7pt 'Times New Roman'"> 一个常见的 HR pȝQ?br />
现在要求?/span>
Employee
做成
webService
Q?/span>
HR
pȝ通过
webService
来调?/span>
Employee
对象Q代码修改如下:
Proxy 使用的要点:
1 、“增加一层间接层”,是Y件系l中常用的手D之一?/span>
2 、具体的实现中, Proxy 有很大差别,有的是简单的?/span> copy-on-write ”,有的是对lg模块的抽象代理。在 JAVA 中常见的 SSH 架构模式中( struts+spring+hibernate Q中Q我们可以把 spring 所在的服务层看成对 hiberate 的代理?/span>
具体的实现可以参?/span> .NET 中的 WebService 的实现?/span>
Copy-on-write 技?br />
sb1.replace("H","L"); pȝ做的动作是, sb1 的代理对象先拯 ”Hello?/span> 字符Ԍ然后用?/span> L ”替换?/span> H ”, sb1 的代理对象重新指向新的对象?/span>
数据库事务的特征Q?/span>
ACID
Atomic
Q原子性)?/span>
Consistency
Q一致性)?/span>
Isolation
Q隔L)?/span>
Durability
Q持久性)?/span>
DBMS
用日志来保证数据的原子性、一致性和持久性;用锁的机制来保证数据的隔L?/span>
二?span style="FONT: 7pt 'Times New Roman'">
事务的边?/span>
数据库支?/span>
2
U事务模式:自动提交和手动提交?/span>
JDBC API 的事务边?/span>
Hibernate API 声明事务边界
注:一?/span>
session
可以对应多个事务Q但是推荐的做法是一?/span>
session
对应一个事务?/span>
三?/font>
多事务的q发问题
当多个事务同时访问相同的数据的时候,E序如果没有采取适当的隔L施,׃发生数据库的q发问题。常见的q发问题有:
W一cM失更斎ͼ撤消事务的时候,把其他的事务已经提交的数据给覆盖了;
脏读Q读了没有提交的数据Q?/span>
虚读Q一个事务读到另外一个事务已l提交的新插入的数据Q?/span>
不可重复读:一个事务读到另外一个事务已l提交的更新的数据;
W二cM失更斎ͼ一个事务覆盖另外一个事务已l提交的更新数据?/span>
四?/strong> ?/span>
一般地Q大型的
DBMS
都会自动的管理锁定机Ӟ但是在对数据的安全性、完整性和一致性有Ҏ要求的地方,可以׃务本w来理琐的机制?/span>
有一点要x的是Q锁的粒度越大,隔离性越好,q发性越差?/span>
按照锁的E度来分有:
׃n锁:用读操作Q非独占的,其他事务可以读,但是不能更新Qƈ发性好Q?/span>
独占锁:用与
insert update
?/span>
delete
{语句,其他事务不能读,也不能改Qƈ发性差Q?/span>
更新锁:执行
update
的时候,加锁?/span>
ȝQ多是事务分别锁定了一个资源,又请求锁定对方已l锁定的资源Q就造成了请求环?/span>
降低死锁的最好办法是使用短事务?/span>
五?/font>
数据库的事务隔离U别
数据库提?/span>
4
U事务隔ȝ别:
Serializable
Q串行化Q(隔离U别最高)
1
Repeatable Read
Q可重复读;
2
Read Commited
Q读已提交数据;
4
Read Uncommited
Q读未提交数据;Q隔ȝ别最低)
8
Hiberate
中的隔离U别的设|?/span>
?/span>
Hibernate
的配|文件中
hibernate.connection.isolation=2
六?/font>
悲观锁和乐观?/span>
从应用程序的角度来看Q锁分ؓ悲观锁和乐观锁?/span>
悲观锁:昄的ؓE序加锁Q但是降低ƈ发性?/span>
Select …? For update;
?/span>
Hibernate
中的代码
Session.get(Account.class,net Long(1),LockMode.UPGRADE)
Q?/span>
//
E序采用悲观?/span>
乐观锁:依靠
DBMS
来管理锁Q程序依靠版本控制来避免q发问题?/span>
在对?/span>
-
关系映射的文件中Q用
<version>
或?/span>
<timestamp>
可以理q发。乐观琐比悲观琐有更好的q发性,优先考虑乐观琐?/span>
l
延迟索;
l
立即索;
l
q切左外q接Q?/span>
Hibernate
提供
2
U方式来定索策略,一中是在配|文件当中,另外一U是在程序种讄。当Ӟ如果你在E序中设|了索策略,那么你在配置文g中的讄也就无效了。另外的一U情冉|
HQL
会忽略配|文件的讄Q而L采用q切左外q接?/span>
一?/span>
cȝ别的?/span>
可以选择的检索策略是立即索和延迟索,默认的是立即索。用配置文g中的
<class>
节点?/span>
lazy
来控制?/span>
注意Q不你在配|?/span>
class
?/span>
lazy
?/span>
true
q是
false
Q对
get()
?/span>
create
Criteria
()
Ҏ都不起作用,只有?/span>
load()
Ҏ起作用?/span>
当你使用的检索策略是
lazy
的时候,当你执行
Customer customer = (Customer)session.load(Customer.class,new Long(1));
的时候,
Hibernate
不从数据库检索数据,而只是生一个代理类Q只有当你执?/span>
Customer.getName();
的时候, Hibernate 才到数据库取数据。所以,如下的代码是会被抛出异常的:
get()
ҎL用的立即索,如果和它相关联的cM是用的立x索,那么也会把相兌的数据也索出来?/span>
二?/span>
一对和多对多关联检?/span>
一般地Qؓ了有减少Ҏ据库的访问,我们往往用gq检索的{略。所以,我们优先使用如下方式Q?/span>
<set class=”order?inverse=”true?lazy=”true?>
但是Q我们在索“多”的一方的时候,
Hibernate
不能为我们生代理类。由此,我们p?/span>
betch-size
的配|来减少
SQL
语句?/span>
当我们?/span>
outer-join
属性的时候,我们没有必要?/span>
lazy
属性了?/span>
Outer-join
会一ơ将“一”方和与之相关的“多”方用左外连接的方式索出来?/span>
Session session = sessionFactory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
Customer customer = (Customer)session.get(Customer.class,new Long(1));
产生?/span>
SQL
语句如下Q?/span>
Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?
一?/span> 用构造函数初始化
1Q??span style="FONT: 7pt 'Times New Roman'">
函数的签名和q回?/span>构造函数可以通过不同的函数签名来q行重蝲。构造函数没有返回|q和q回gؓ void 的是不同?/span>
1Q??span style="FONT: 7pt 'Times New Roman'">
构造函数的重蝲如何区分构造函数的不同呢,用不同的函数{。函数签名的序不同都可以,但是q样的编E风格是不好的?/span>
函数的签名会上升转型Q当没有合适的函数{出现的时候)Q但是不会窄化{型,你必要昄的进行强制类型{换?/span>
不能?/span> return value 的不同作为重载的标准?/span>
当程序提供了构造函C后,pȝ׃在提供默认的构造函C?/span>
This 关键字指的是当前对象Q有?/span> this 后,可以在构造函C以如下的方式调用
1Q??span style="FONT: 7pt 'Times New Roman'">
Static 的含?/span>你无法在 static 函数中调?/span> non-static 函数Q但是你可以?/span> non-static 中调?/span> static 函数?/span>
二?/span> cȝ清理
JAVA 的垃圑֛收机制只能回?/span> new 出来的对象,但是你的对象不是 new 出来的而获得的“特D”内存,那么 JAVA 的垃圑֛收就不能处理Q这样就必须?/span> finalize() 函数来释放你的“特D”内存?/span>
JAVA 的清理方式是先调用你?/span> finalize() Q然后在下次垃圾回收的时候来清理你的“特D”内存?/span>
关键的三句话Q?/span>
垃圾回收不等于析构;
你的对象可能不被回收Q?/span>
垃圾回收动作只回收内存?/span>
?/span> System.gc() 可以用来l结动作的发?/span>