spring AoP学习 -----spring AoP 的实现机制
spring AoP属于第二代AoP,采用动态代理机制和字节码生成技术实现,在运行期间为目标对象生成一个代理对象,而将横切逻辑织入到这个代理对象中,系统最终使用的是织入了的横切逻辑的代理对象。
- 通过代理模式(在另外一篇文章中讲述)
- 通过动态字节码生成:实现原理:对目标对象进行集成扩展,为其生成相应的子类,而子类可以通过覆写来扩展父类的行为,只要将横切逻辑的实现放到子类中,然后让系统使用扩展后的目标对象的子类,就可以达到与代理模式相同的效果了。下面是一个简单的实例:
public class CglibRequestCtrlCallback implements MethodInterceptor{ private static final Log logger = LogFactory.getLog(CglibRequestCtrlCallback.class); @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub if(method.getName().equals("request")){ TimeOfDay startTime = new TimeOfDay(0,0,0); TimeOfDay endTime = new TimeOfDay(5,59,59); TimeOfDay currentTime = new TimeOfDay(); if(currentTime.isAfter(startTime)&¤tTime.isBefore(endTime)){ logger.debug("the time is error"); return null; } logger.info("the time is right"); return proxy.invokeSuper(obj, args); } return null; } }
public class CglibClient { @Test public void cglibTest(){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(CglibRequestable.class); enhancer.setCallback(new CglibRequestCtrlCallback()); CglibRequestable proxy = (CglibRequestable)enhancer.create(); proxy.request(); } }
cglib动态字节码实现的唯一局限就是当父类为final是无法进行覆写。