spring aop 如何切面到mvc 的controller, service

csuzxm000 2015-11-13

Spring+SpringMVC+Mybatis利用AOP自定义注解实现可配置日志快照记录http://unkeltao.com/blog/2014/07/22/spring-plus-springmvc-plus-mybatis-aop/

基于注解的SpringAOP的配置和使用http://my.oschina.net/sniperLi/blog/491854

Spring中的AOP(五)——在Advice方法中获取目标方法的参数http://my.oschina.net/itblog/blog/211693,这里有aop的更多知识

拦截Controller

http://yjian84.iteye.com/blog/1920787

Indeedyourcontroller(annotatedby@Controller)andyouraspects(annotatedby@Aspect)shouldbeinthesameSpringcontext.

Usuallypeopledefinetheircontrollersinthedispatch-servlet.xmlorxxx-servlet.xmlandtheirservicebeans(includingtheaspects)inthemainapplicationContext.xml.Itwillnotwork.

WhenSpringinitializestheMVCcontext,itwillcreateaproxyforyourcontrollerbutifyouraspectsarenotinthesamecontext,Springwillnotcreateinterceptorsforthem.

这个人说的好像很对啊。我把aspectj和springmvc的配置文件放到一起就可以用到controller上了。

在servlet.xml加入

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

sysLogAspectJ

package com.pandy.core.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 项目名称: wp_idea_linux
 * 功能说明: 在servlet.xml配置:  <aop:aspectj-autoproxy proxy-target-class="true" />
 * 创建者: Pandy,
 * 邮箱: [email protected], [email protected]
 * 版权:
 * 官网:
 * 创建日期: 15-11-13.
 * 创建时间: 下午9:42.
 * 修改历史:
 * -----------------------------------------------
 */
@Aspect
@Component
public class ControllerLogAspect {

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void cutController(){
    }

    @Around("cutController()")
    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable{
        System.out.println("=================================ControllerLogAspect执行方法2");
        return point.proceed();
    }
}

拦截Service等

在applicationContext.xml(扫描service的类的配置文件)加入

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
package com.pandy.core.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 项目名称: wp_idea_linux
 * 功能说明: 在applicationContext.xml(扫描service的配置文件)配置:  <aop:aspectj-autoproxy proxy-target-class="true" />
 * 创建者: Pandy,
 * 邮箱: [email protected], [email protected]
 * 版权:
 * 官网:
 * 创建日期: 15-11-13.
 * 创建时间: 下午9:42.
 * 修改历史:
 * -----------------------------------------------
 */
@Aspect
@Component
public class ServiceLogAspect {

    @Pointcut("within(@org.springframework.stereotype.Service *)")
    public void cutService(){
    }

    @Around("cutService()")
    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable{
        System.out.println("=================================ServiceLogAspect执行方法2");
        return point.proceed();
    }
}

相关推荐