1.基于@AspectJ
(1)导入相应的包:aspectjweaver-1.6.10.jar
和使用Pointcut和Advice接口描述切点和增强不同,@AspectJ采用注解的方式来描述切点和增强
首先定义一个javabean
@Aspect //定义切面
public class LogginInterceptor {
private static Logger log = Logger.getLogger(LogginInterceptor.class);
@Before(value="execution(* com.suning.bi.mybatis.service..*(..))")// 定义增强和切入点
public void printAction(JoinPoint joinPoint){// 定义增强处理逻辑
log.info("getTarget:"+joinPoint.getTarget()+";"+"getAgrs:"+joinPoint.getArgs()+";"+"getSignture:"+joinPoint.getSignature()+";"+"方法执行");
}
}
(2)在spring配置文件中完成切面织入
<!-- 使用aspectJ方式 -->
<bean id="loggingInterceptor" class="com.suning.bi.springMVC.interceptor.LogginInterceptor"></bean>
<aop:aspectj-autoproxy/>
2.使用aop:advisor的方式(1)定义一个javabean
public class ExecuteOver implements AfterReturningAdvice{
private static Logger log = Logger.getLogger(ExecuteOver.class);
/* (non-Javadoc)
* @see org.springframework.aop.AfterReturningAdvice#afterReturning(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
*/
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
// TODO Auto-generated method stub
log.info(arg1.getName()+"执行完毕");
}
}
(2)在spring配置文件中配置
<!-- 使用 advisor的方式 -->
<bean id="executeOver" class="com.suning.bi.springMVC.interceptor.ExecuteOver"></bean>
<aop:config proxy-target-class="false">
<aop:pointcut id="afterPointcut" expression="execution(* com.suning.bi.mybatis.service..*(..))"/>
<aop:advisor advice-ref="executeOver" pointcut-ref="afterPointcut" />
</aop:config>
3.使用<aop:aspect>方式(1)配置javabean
public class AroundMethod {
private static Logger log = Logger.getLogger(AroundMethod.class);
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
log.info(joinPoint.getSignature().getName()+"经过环绕增强开始执行");
joinPoint.proceed();
log.info(joinPoint.getSignature().getName()+"经过环绕增强执行结束");
}
}
(2)在spring配置文件中配置aspect
<!-- 使用<aop:aspect>方式 -->
<bean id="aroundMethod" class="com.suning.bi.springMVC.interceptor.AroundMethod"></bean>
<aop:config proxy-target-class="false">
<aop:aspect ref="aroundMethod">
<aop:pointcut id="aroundPointcut" expression="execution(* com.suning.bi.springMVC..*(..))"/>
<aop:around pointcut-ref="aroundPointcut" method="around"/>
</aop:aspect>
</aop:config>/code]
[b]4.使用接口的方式,我没有使用过,自己可以去看对应的API。[/b]
[b]5.可以使用Interceptor实现代理[/b]
<bean id="autoproxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 可以是Service或DAO层(最好是针对业务层*Service) -->
<property name="beanNames">
<list>
<!-- 必要的时候可以注入具体的service,如UserService -->
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<!-- 在这里放入自己编写的Interceptor -->
<value>transactionInterceptor</value>
</list>
</property>
</bean>
我们在日常的使用中可以根据自己的需要选择具体使用那种方式,但是在一个项目中不建议使用过多的技术种类去同一种需求。