通过学习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();
}
}