spring系列之 回调函数的使用
spring使用了大量的回调函数,如HibernateCallBack,打开你的eclipse,ctrl+shift+t,再输入*CallBack,你可以看到有多少地方在使用回调函数,下面分析一下大牛们为什么频繁使用这个CallBack函数。
废话少说,先来个例子说事儿。
?
view plain- package?com.lixuehui.callbacktest;??
- ??
- public?interface?MySession?{??
- ?public?Object?createMyQuery();??
- }??
- ??
- ???
- ??
- package?com.lixuehui.callbacktest;??
- ??
- public?class?MySessionImpl?implements?MySession{??
- ?public?Object?createMyQuery(){??
- ??return?"Hello,World!";??
- ?}??
- }??
- ??
- ???
- ??
- package?com.lixuehui.callbacktest;??
- ??
- public?interface?MyHibernateCallBack?{??
- ?Object?doInHibernate(MySession?target);??
- }??
- ??
- ???
- ??
- package?com.lixuehui.callbacktest;??
- ??
- abstract?class?MyTemplete{??
- ?protected?MySession?createSession(){??
- ??return?new?MySessionImpl();//?模拟创建一个session??
- ?}??
- ??
- ?protected?Object?execute(MyHibernateCallBack?callback){??
- ??MySession?mySession?=?createSession();?//?模拟创建一个session??
- ??Object?object?=?callback.doInHibernate(mySession);??
- ??return?object;??
- ?}???
- }??
- ??
- class?TempClass?implements?MyHibernateCallBack?{??
- ?public?Object?doInHibernate(MySession?session)?{??
- ??return?session.createMyQuery();??
- ?}??
- }??
- ??
- ??
- public?class?Test?extends?MyTemplete{??
- ??
- ?public?static?void?main(String[]?args)?{??
- ??Object?object?=?new?Test().execute(new?MyHibernateCallBack(){??
- ???//这处new这个接口,创建一个匿名内部类,相当于new了一个实现MyHibernateCallBack接口的类,然后再将这个匿???名对象传给execute方法。??
- ???public?Object?doInHibernate(MySession?session){??
- ????return?session.createMyQuery();??
- ???}??
- ??});??
- ??System.out.println(object);??
- ?}??
- }??
- //Test类相当于:??
- public?class?Test?extends?MyTemplete?{??
- ??
- ?public?static?void?main(String[]?args){??
- ??TempClass?temp?=?new?TempClass();??
- ??Object?object?=?new?Test().execute(temp);??
- ??System.out.println(object);??
- ?}??
- }??
?
?不过这么写灵活度比较低,doInHibernate里的如果做另外的操作的话,就要重复修改TempClass的doInHibernate方法。
看到回调的好处了么?
?
我觉得这个回调的好处是:
通过创建匿名类,动态实现接口,并实现接口的方法,侧重点在于接口,不在乎实现接口的类,故采用匿名类。
如果你遇到了侧重点在于接口,而不在乎类实现的情况,就可以采取这种回调方式。
Oberser,swing的事件机制,以及java里的自定义事件机制,频繁用的都是回调.?
包括java里的main函数,也可以理解为回调?
那想想,为什么java *** 的时候就必须走main方法中呢,可见java ***的时候内部也是回调用的main,所以才跑到main方法里.main方法扔给二次开发人员,随意施展.
回调,回调,顾名思义:"你先实现吧,实现完了回头我调你".