通過學習spring事務模板:
提供服務者可以要求客戶端調用時實現第三方接口,該接口實現會在服務者提供服務時調用,完成服務方回調客戶段代碼。而在接口實
現參數可以充當服務方提供給客戶端額外的功能。
例如:
1:服務方爲TransactionTemplate.execute,這個方法提供事務管理功能。
2:而客戶端會依照服務方實現TransactionCallback這個第三方接口,實現doInTransaction(TransactionStatus status)這個方法。3:在TransactionTemplate提供事務功能時,又調用了客戶端實現的TransactionCallback接口的方法,即具體的業務邏輯。
4:接口實現傳入了TransactionStatus對象,客戶端實現的具體業務中,會用到事務回滾這個服務方提供的額外的功能。
5:客戶端實現回調代碼通常使用匿名類實現,代碼比較簡單。
/**
* 匿名內部類
*
* 所謂的匿名就是該類連名字都沒有,只是顯示地調用一個無參的父類的構造方法。
*
* @author 75-qj
* @version $Id: A.java, v 0.1 2009-12-28 下午05:27:32 75-qj Exp $
*/
public class A {
private Frame f;
private TextField tf;
public A() {
f = new Frame("aa");
tf = new TextField(30);
}
public void launchFrame() {
Label label = new Label("Click and drag the mouse");
f.add(label, BorderLayout.NORTH);
f.add(tf, BorderLayout.SOUTH);
f.addMouseMotionListener(new MouseMotionAdapter() { //匿名類開始
public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging: x=" + e.getX() + "Y=" + e.getY();
tf.setText(s);
}
}); //匿名類結束
f.setSize(300, 200);
f.setVisible(true);
}
}
/**
* 內部類
*
* 一個內部類的對象可訪問外部類的成員方法和變量,包括私有的成員。即內部類實例對包含它的哪個類的實例來說,是特權的。
* 對於同一個包中的其他類來說,內部類能夠隱藏起來,換句話說,內部類不管方法的可見性如何,
* 那怕是public,除了包容類,其他類都無法使用它。
*
* @author 75-qj
* @version $Id: InnerClass.java, v 0.1 2009-12-28 下午05:27:20 75-qj Exp $
*/
public class InnerClass{
private Frame f;
private TextField tf;
public InnerClass(){
f=new Frame("Inner classes example");
tf=new TextField(30);
}
public void launchFrame() {
Label label = new Label("Click and drag the mouse");
f.add(label, BorderLayout.NORTH);
f.add(tf, BorderLayout.SOUTH);
f.addMouseMotionListener(new MyMouseMotionListener());/*參數爲內部類對象*/
f.setSize(300, 200);
f.setVisible(true);
}
class MyMouseMotionListener extends MouseMotionAdapter { /*內部類開始*/
public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging: x=" + e.getX() + "Y=" + e.getY();
tf.setText(s);
}
};
public static void main(String args[]) {
InnerClass obj = new InnerClass();
obj.launchFrame();
}
}