spring aop的使用

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>

我们在日常的使用中可以根据自己的需要选择具体使用那种方式,但是在一个项目中不建议使用过多的技术种类去同一种需求。
  

猜你喜欢

转载自fish-no7.iteye.com/blog/1727848