談到前置增強和后置增強,就必須理解切入點(pointcut),我剛開始也不是太理解它是怎么實現前置增強和后置增強的,其中主要原因是忽略了切入點,下面請看示例:
只展示部分代碼!
1.前置增強代碼
package com.aop; import java.lang.reflect.Method; import java.util.Arrays; import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice; /** * * @author Mr * 前置增強 */ public class LoggerBefore implements MethodBeforeAdvice { //創建類的log對象 private static final Logger log = Logger.getLogger(LoggerBefore.class); @Override public void before(Method method, Object[] arguments, Object target) throws Throwable { log.info("調用了"+target+"的"+method.getName()+"方法。方法參數是"+Arrays.toString(arguments)); } }
2.后置增強代碼
package com.aop; import java.lang.reflect.Method; import org.apache.log4j.Logger; import org.springframework.aop.AfterReturningAdvice; /** * * @author Mr * 后置增強 */ public class LoggerAfterReturing implements AfterReturningAdvice { //創建類的log對象 private static final Logger log = Logger.getLogger(LoggerAfterReturing.class); @Override public void afterReturning(Object returnValue, Method method, Object[] arguments, Object target) throws Throwable { log.info("調用了"+target+"的"+method.getName()+"方法。方法返回值是"+returnValue); } }
3.applicationContext.xml配置文件內容,其中實體類和dao以及biz等的實現類就不展示了
<bean id="dao" class="com.dao.impl.IUserDaoImpl"></bean> <bean id="biz" class="com.biz.impl.IUserBizImpl"> <!-- 要引用dao --> <property name="dao" ref="dao"></property> </bean> <bean id="logbefore" class="com.aop.LoggerBefore"></bean> <bean id="logafter" class="com.aop.LoggerAfterReturing"></bean> <aop:config> <!-- 引用的是biz中的 --> <aop:pointcut expression="execution(public void save(com.domain.User))" id="pointcut"/> <!-- 將增強處理和切入點結合在一起,在切入點處插入增強處理,完成“織入” --> <aop:advisor advice-ref="logbefore" pointcut-ref="pointcut"/> <aop:advisor advice-ref="logafter" pointcut-ref="pointcut"/> </aop:config>
4.結果展示