结合实际研发经验讲解spring核心模块aop

image.png
  • AOP:是Spring的AOP库,提供了拦截器的机制。
  • AOP面向切面编程,基于代理设计模式。
  • 主要功能:日志记录,性能统计,事务处理,安全控制,异常处理等。

spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

AOP使用的场景

AOP用来封装横切关注点,具体可以在下面的场景中使用。

Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging,tracing,profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

Spring AOP 和 AspectJ

Spring aop 旨在提供一个跨 Spring IoC 的简单的 aop 实现, 以解决程序员面临的最常见问题。它不打算作为一个完整的 AOP 解决方案 —— 它只能应用于由 Spring 容器管理的 bean。
另一方面, AspectJ 是原始的 aop 技术, 目的是提供完整的 aop 解决方案。它更健壮, 但也比 Spring AOP 复杂得多。还值得注意的是, AspectJ 可以在所有域对象中应用。

spring aop使用介绍

要想使用@Aspect形式的aop,首先需要导入aspectj相关的jar包
引入jar


            org.aspectj
            aspectjweaver
            1.8.4
        
@Controller
@RequestMapping("/erp/passport/menu")
public class MenuUrlController  {
    private Logger logger = Logger.getLogger(MenuUrlController.class);
    /**
     * 读取用户权限信息
     * @param request
     * @param response
     * @return
     */
    @ResponseBody
    @AuthChecker()
    @RequestMapping(value = "/getMenuList",produces="text/html;charset=UTF-8")
    public String getMenuList(HttpServletRequest request, HttpServletResponse response) {
        List a = new ArrayList();
        Map m = new HashMap<>();
        m.put("name", "JOB同步锁配置");
        m.put("url", "erp.yaoex.com/erp/job/taskLock/list");
        m.put("urlNumber", "F05001");
        a.add(m);
        Map m2 = new HashMap<>();
        m2.put("submenu", a);
        m2.put("name", "客户端管理");
        m2.put("urlNumber","F01");
        List a2 = new ArrayList();
        a2.add(m2);
        String result = JSON.toJSONString(a2);
        logger.info(result);
        return result;
    }

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。

/**
 * @author xushuai
 * @date 2019年3月15日
 * @note HTTP 接口鉴权、方法耗时统计
 */
@Component
@Aspect
public class HttpAopAdviseDefine {
    private static Logger logger = Logger.getLogger(HttpAopAdviseDefine.class);
    // 定义一个 Pointcut, 使用 切点表达式函数 来描述对哪些 Join point 使用 advise.
    //@annotation:用于匹配当前执行方法持有指定注解的方法;
    @Pointcut("@annotation(com.yaoex.contract.controller.aop.AuthChecker)")
    public void pointcut() {
    }

    // 定义 advise   Advice(通知/增强):增强的代码块。
    @Around("pointcut()")
    public Object checkAuth(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();

        // 检查用户所传递的 token 是否合法
        String token = getUserToken(request);
        if (!token.equalsIgnoreCase("123456")) {
            return "错误, 权限不合法!";
        }

        return joinPoint.proceed();
    }

    private String getUserToken(HttpServletRequest request) {
        Cookie[] cookies = (Cookie[]) request.getCookies();
        if (cookies == null) {
            return "";
        }
        for (Cookie cookie : cookies) {
            if (cookie.getName().equalsIgnoreCase("user_token")) {
                return cookie.getValue();
            }
        }
        return "";
    }
}

package com.yaoex.contract.controller.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author xushuai
 * @date 2019年3月15日
 * @note  Spring AOP
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthChecker {

}

springmvc-xml 配置


    

你可能感兴趣的:(结合实际研发经验讲解spring核心模块aop)