眾所周知,Spring是提倡基於接口編程的。 但也有些Service類,比如SaleOrderManager 和SaleOrderManagerImpl,只有5%的機會再有另一個Impl實現。95%時間裡這兩兄弟站一起,就像C++裡的.h和.cpp,徒增維護的繁瑣,所以剛開始用Spring的時候就想去掉它,今天偶然在群裡聊起動態代理,算是搞明白了其中的道理,謝謝Sparkle :) IOC是不會強制基於接口的,是這些Service類一般要使用Spring的聲明式事務機制,而聲明式的事務機制是使用Spring AOP來實現的。 再看Spring AOP,混合使用了Java的動態代理和CGLib2,因為: Java的動態代理是AOP的理想方式,但只能用於接口。如果基於Class的時候,Spring AOP就會用CGLib生成目標類的子類來實現AOP,相當現實。 所以,我們只要指定使用聲明式事務bean使用CGLib來實現AOP,就可以不基於接口編程了。 指定的方式是設置proxyTargetClass為true。eg.
又討論了一下這樣的效率問題, 因為這些Service Bean都是單例,效率應該不受影響。