ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AOP的三种实现方法

2022-02-05 09:06:38  阅读:157  来源: 互联网

标签:info LogInterceptor AOP 三种 org import logger 方法 public


Spring AOP的3种实现方式

对于框架的学习,我觉得得先会用,然后再深入原理。关于Spring AOP的实现我在这里划分成3个方式(以日志管理为例)废话不多说,直接上代码了。(以下代码是基于我之前所写的SSM框架整合的例子,如果有需要可查看我之前的博客)

配置之前注意配置文件要加上命名空间:xmlns:aop="http://www.springframework.org/schema/aop"

1.基于xml配置的实现

spring-mvc.xml

  

 <!-- 使用xml配置aop -->
    <!-- 强制使用cglib代理,如果不设置,将默认使用jdk的代理,但是jdk的代理是基于接口的 -->
    <aop:config proxy-target-class="true" />  
    <aop:config>
    <!--定义切面-->
     <aop:aspect id="logAspect" ref="logInterceptor">
     <!-- 定义切入点 (配置在com.gray.user.controller下所有的类在调用之前都会被拦截)-->
      <aop:pointcut expression="execution(* com.gray.user.controller.*.*(..))" id="logPointCut"/>
      <!--方法执行之前被调用执行的-->
      <aop:before method="before" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
     <aop:after method="after" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
     </aop:aspect>
    </aop:config>


LogInterceptor.java

import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
@Component
public class LogInterceptor {
    private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
    public void before(){
        logger.info("login start!");
    }
    
    public void after(){
        logger.info("login end!");
    }
}


在这里我没有配bean是因为我在之前的配置文件里面写了自动扫描组件的配置了
要加入日志管理逻辑的地方

@RequestMapping("/dologin.do") //url
public String dologin(User user, Model model){
    logger.info("login ....");
    String info = loginUser(user);
    if (!"SUCC".equals(info)) {
        model.addAttribute("failMsg", "用户不存在或密码错误!");
        return "/jsp/fail";
    }else{
        model.addAttribute("successMsg", "登陆成功!");//返回到页面说夹带的参数
        model.addAttribute("name", user.getUsername());
        return "/jsp/success";//返回的页面
    }
  }


结果截图:


2.基于注解的实现

spring-mvc.xml

   

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


LogInterceptor.java

@Aspect
@Component
public class LogInterceptor {
    private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
    @Before(value = "execution(* com.gray.user.controller.*.*(..))")
    public void before(){
        logger.info("login start!");
    }
    @After(value = "execution(* com.gray.user.controller.*.*(..))")
    public void after(){
        logger.info("login end!");
    }
}


要加入逻辑的地方同上。
结果截图:

3.基于自定义注解的实现

基于注解,所以spring-mvc.xml也是和上面的一样的。

LogInterceptor.java(这里我只加入前置日志)

 
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import com.gray.annotation.Log;
 
@Aspect
@Component
public class LogInterceptor {
    private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
 
    @Pointcut("@annotation(com.gray.annotation.Log)")    
    public void controllerAspect() {
        
    }
    @Before("controllerAspect()")
    public void before(JoinPoint joinPoint){
        logger.info(getOper(joinPoint));
    }
    private String getOper(JoinPoint joinPoint) {
        MethodSignature methodName = (MethodSignature)joinPoint.getSignature();
        Method method = methodName.getMethod();
        return method.getAnnotation(Log.class).oper();
    }
}

同时,加入逻辑的地方需要加入Log注解

@RequestMapping("/dologin.do") //url
@Log(oper="user login")
public String dologin(User user, Model model){
    logger.info("login ....");
    String info = loginUser(user);
    if (!"SUCC".equals(info)) {
        model.addAttribute("failMsg", "用户不存在或密码错误!");
        return "/jsp/fail";
    }else{
        model.addAttribute("successMsg", "登陆成功!");//返回到页面说夹带的参数
        model.addAttribute("name", user.getUsername());
        return "/jsp/success";//返回的页面
    }
  }


结果截图:

以上就是我总结的SpringAOP的3种实现方式,对于这我还有点话要说,常见的基于注解的方式除了before和after,还有around和AfterThrowing等,在做第三种方式实验的时候还遇到这种错误:error at ::0 can't find referenced pointcut。

我的解决办法是:因为我的jdk是1.7,与原来在pom.xml中配的那个aspectjweaver的jar包版本不匹配,所以我需要升级,由1.5.4改成1.7.4。

原文链接:https://blog.csdn.net/donggua3694857/article/details/52752503

标签:info,LogInterceptor,AOP,三种,org,import,logger,方法,public
来源: https://blog.csdn.net/weixin_46565024/article/details/122787882

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有