Spring AOPでControllerをブロックする方法を実現します.

7074 ワード

SpringのBeanスキャンとSpring-MVCのBenスキャンは分離されていますので、両者のBeaビンは二つの異なるApplicationに位置しています.そしてSpring-MVCのBenスキャンはSpringのBenスキャンより早いので、Controller Bean生成が完了したら、SpringのBeanスキャンを実行します.
このような場合もデータベーストランザクションに存在し、ServiceのBeanスキャンがspring-mvc.xmlに配置されている場合、データベース事務マネージャがappication.xmlに配置されていると、データベーストランザクションが無効になるという原理と同じです.
したがって、ここでは、AOPをControllerスキャン配置のファイルに置く必要があります.
Springのプロファイルは、以下のように構成されています.
<context:component-scan base-package="cn.test.demo.dao" />
<context:component-scan base-package="cn.test.demo.service" />
Spring MVCのプロファイルspring-mvc.xml

<context:component-scan base-package="cn.test.demo.controller" />
<context:component-scan base-package="cn.test.demo.aspect" />

<aop:aspectj-autoproxy>aop:aspectj-autoproxy>
@Aspect
@Component
public class LoggingAspect
{
protected final org.slf4j.Logger log = LoggerFactory.getLogger(this.getClass());

/**
*
*/
@Pointcut("execution(* cn.test.demo.controller..*Controller*.*(..))")
public void controllerMethod()
{

}

@Around("controllerMethod()")
   public Object aroundControllerAdvice(ProceedingJoinPoint joinPoint)
{
try
{
return joinPoint.proceed();
} catch (Throwable throwable)
{
throwable.printStackTrace();
}finally
{
try {
Signature signature = joinPoint.getSignature();
if (signature != null) {
String clazzName = signature.getDeclaringTypeName();
String method = signature.getName();
log.info(clazzName,method);
}
} catch (Exception e) {
log.error("aroundControllerAdvice", e);
}
}
return null;
}
@AfterThrowing(value="controller Method",throwing="exception")public void afterThrowing(JoinPoint jection,Exception exception){Signature=jection};String method=signature.get Name();String param=methodParams;log.error('}.({})),clazName,method,param,exception);String[]paramNames=cs.getParamNames=cs.getParameterNames();Object[]paramValues=pjp.getAgs();for(int i=0;i