iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java AOP篇
  • 503
分享到

Java AOP篇

javaspring开发语言 2023-10-23 08:10:20 503人浏览 安东尼
摘要

目录         一、什么是AOP          二、为什么使用AOP         三、AOP的体系结构         四、AOP原理         五、AOP能做什么         六、AOP案例-- 使用AOP模拟事务

目录

        一、什么是AOP

         二、为什么使用AOP

        三、AOP的体系结构

        四、AOP原理

        五、AOP能做什么

        六、AOP案例-- 使用AOP模拟事务管理

        6.1 创建一个Spring工程

        6.2 引入相关的依赖

        6.3 写spring的配置文件。  

        6.4 创建service接口以及实现类

        6.5 定义切面类

        6.6 测试

        6.7 aop中的通知类型

        七、AOP案例--使用注解切点

        7.1 创建Controller包

        7.2 定义切面    

        7.3 修改Spring配置文件

         八、AOP案例--使用自定义注解

        8.1 自定义注解

        8.2 使用自定义注解

        8.3 定义切面

        8.4 测试


        一、什么是aop

        AOP(Aspect Oriented Programming)面向切面思想,是spring的三大核心思想之一(AOP-面向切面、ioc-控制反转、DI-依赖注入)

        AOP,一般成为面向切面,作为面向对象OOP的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块之间的耦合度,提高了系统的可维护性。可用于权限认证,日志和事务处理.         

         二、为什么使用AOP

        Java是一个面向对象(OOP)的编程语言,但它有个弊端就是当需要为多个不具有继承关系的对象引入一个公共行为时,例如日志记录、权限校验、事务管理、统计等功能,只能在每个对象里都引用公共行为,这样做不便于维护,而且有大量重复代码,AOP的出现弥补了OOP的这点不足

        例如:

        有多少个业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。当然用面向对象的思想,可以把这些重复的代码抽离出来,写成公共方法,就是下面这样

         

        代码冗余和可维护性的问题得到了解决,但每个业务方法中依然要依次手动调用这些公共方法,也是略显繁琐。 有没有更好的方式呢?有的,那就是AOP,AOP将权限校验、日志记录等非业务代码完全提取出来,与业务代码分离,并寻找节点切入业务代码中 。         

        动态代理 :

        三、AOP的体系结构

        AOP要做的三件事是:在哪里切入,什么时候切入,切入后做什么事

        在哪里切入:就是权限校验等非业务操作在哪些业务代码中执行

        什么时候切入:就是业务代码执行前还是执行后

        切入后做什么事:比如做权限校验,日志记录等等

 

  • Pointcut:切点,决定处理如权限校验、日志记录等在何处切入业务代码中(即织入切面)。切点分为execution方式和annotation方式。前者可以用路径表达式指定哪些类织入切面,后者可以指定被哪些注解修饰的代码织入切面。

  • Advice:处理,包括处理时机和处理内容。处理内容就是要做什么事,比如校验权限和记录日志。处理时机就是在什么时机执行处理内容,分为前置处理(即业务代码执行前)、后置处理(业务代码执行后)等。

  • Aspect:切面,即Pointcut和Advice。

  • Joint point:连接点,是程序执行的一个点。例如,一个方法的执行或者一个异常的处理。在 Spring AOP 中,一个连接点总是代表一个方法执行。

  • Weaving:织入,就是通过动态代理,在目标对象方法中执行处理内容的过程。

        四、AOP原理

        之前提到jdk代理和Cglib代理两种动态代理,优秀的Spring框架把两种方式在底层都集成了进去,无需担心自己去实现动态生成代理。那么Spring是如何生成代理对象的?创建容器对象的时候,根据切入点表达式拦截的类,生成代理对象。如果目标对象有实现接口,使用jdk代理如果目标对象没有实现接口,则使用Cglib代理。然后从容器获取代理后的对象,在运行期植入"切面"类的方法。如果目标类没有实现接口,且class为final修饰的,则不能进行Spring AOP编程

        

        封装了JDK代理和Cglib代理。 当被代理的类实现了接口,则使用JDK代理。如果没有实现接口则使用Cglib代理。

        类没有实现接口且使用final修饰 不能使用AOP.

        五、AOP能做什么

  • Spring声明式事务管理配置 [事务管理]

  • Controller层的参数校验

  • 使用Spring AOP实现MySQL数据库读写分离案例分析

  • 在执行方法前,判断是否具有权限

  • 对部分函数的调用进行日志记录。监控部分重要函数,若抛出指定的异常,可以以短信或邮件方式通知相关人员

  • 信息过滤,页面转发等等功能。

        什么是事务?

        有一系列动作组成的一个单元,这些动作要么全部执行,要么全部不执行。

        例子: 张三给李四转账。[1] 张三减钱 [2]李四加钱。

                mysql是支持事务的。

        六、AOP案例-- 使用AOP模拟事务管理

        6.1 创建一个Spring工程

        

        6.2 引入相关的依赖

    4.0.0    com.wjk    java-11-11-AOP    1.0-SNAPSHOT                                org.springframework            spring-WEBmvc            5.2.9.RELEASE                                    org.springframework            spring-aspects            5.2.9.RELEASE                            com.fasterxml.jackson.core            jackson-databind            2.13.2.2                            com.alibaba            fastJSON            1.2.75            

        6.3 写spring的配置文件。  

                

        6.4 创建service接口以及实现类

package com.wjk;public interface IUserService {    public void save();}
package com.wjk.imp;import com.wjk.IUserService;import org.springframework.stereotype.Service;@Servicepublic class UserService implements IUserService {    public void save() {        System.out.println("保存用户");    }}
package com.wjk.imp;import com.wjk.IUserService;import org.springframework.stereotype.Service;@Servicepublic class OrderService {    public void save() {        System.out.println("保存订单");    }}

        6.5 定义切面类

@Component //校验spring容器来创建该类对象。@Aspect  //标记该类为切面类public class TransactionAop {          @Pointcut("execution(* com.ykq.aop01.service.impl.*.*(..))")     private void transationAdvice(){}     @Before("transationAdvice()")     public void before(){         System.out.println("前置通知---开启事务");     }}

        6.6 测试

public class Test {    public static void main(String[] args) {        //读取spring配置文件        ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");        //该类使用了接口---使用JDK动态代理        IUserService userService = app.getBean(IUserService.class);        userService.save();        //该类没有实现接口---切面使用cglib动态代理        OrderService orderService = app.getBean(OrderService.class);        orderService.save();    }}

        6.7 aop中的通知类型

                

package com.wjk.aspect;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;@Component  //校验spring容器来创建该类对象@Aspect     //标记该类为切面类public class TransactionAop {        @Pointcut("execution(* com.wjk.imp.*.*(..))")    public void transationAdvice(){    };        @Before("transationAdvice()")    public void before(){        System.out.println("前置处理--开启事务");    }        @After("transationAdvice()")    public void after(){        //理解为方法执行完毕        System.out.println("后置处理--提交事务");    }        @AfterReturning("transationAdvice()")    public void afterReturning(){        System.out.println("后置返回通知");    }        @AfterThrowing("transationAdvice()")    public void afterThrowing(){        System.out.println("异常处理,事务回滚");    }    @Around("transationAdvice()")    public void around(ProceedingJoinPoint joinPoint){        System.out.println("环绕通知前");        try {            joinPoint.proceed();//回调连接点方法            System.out.println("环绕方法执行完毕");        } catch (Throwable throwable) {            System.out.println("环绕通知-异常");        }finally {            System.out.println("环绕通知-执行最终");        }    }}

        七、AOP案例--使用注解切点

        在使用GetMapping注解的方法上,使用切面

        7.1 创建Controller包

package com.wjk.controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/aop")public class HelloController {    @GetMapping("/getTest")    public String getTest(){        System.out.println("执行了getTest");        return "getTest";    }    @PostMapping("/postTest")    public String postTest(){        System.out.println("执行了postTest");        return "postTest";    }}

        7.2 定义切面    

package com.wjk.aspect;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Component@Aspectpublic class LogAdvice {    @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")    private void logAdvice(){}    @Before("logAdvice()")    public void before(){        System.out.println("添加getTest的前置日志");    }}

        7.3 修改Spring配置文件

                            

         八、AOP案例--使用自定义注解

        8.1 自定义注解

package com.wjk.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(value = ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MyPermission {    String value() default "";}

        8.2 使用自定义注解

package com.wjk.controller;import com.wjk.annotation.MyPermission;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.List;@RestController@RequestMapping("/user")public class UserController {    @RequestMapping("/list")    @MyPermission("list")    public String list(){        System.out.println("查询所有用户");        return "list";    }    @PostMapping("/save")    @MyPermission("save")    public String save(){        System.out.println("添加用户");        return "save";    }}

        8.3 定义切面

package com.wjk.aspect;import com.wjk.annotation.MyPermission;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;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.springframework.stereotype.Component;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;@Component@Aspectpublic class PermissionAdvice {    //定义切点    @Pointcut("@annotation(com.wjk.annotation.MyPermission)")    public void permission(){    }    private List permission=new ArrayList();    public  PermissionAdvice(){        permission.add( "list");        permission.add("delete");        permission.add("update");    }    @Around("permission()")    public Object before(ProceedingJoinPoint joinPoint) throws Throwable {        //得到连接点执行的方法对象        MethodSignature signature= (MethodSignature) joinPoint.getSignature();        Method method = signature.getMethod();        //得到方法上的注解        MyPermission annotation = method.getAnnotation(MyPermission.class);        if (annotation!=null){            //获取注解属性的value值            String value = annotation.value();            if (!permission.contains(value)){                return "quanxianbuzu";            }        }        return joinPoint.proceed();    }}

        8.4 测试

来源地址:https://blog.csdn.net/wk3510/article/details/127819217

--结束END--

本文标题: Java AOP篇

本文链接: https://www.lsjlt.com/news/440201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java AOP篇
    目录         一、什么是AOP          二、为什么使用AOP         三、AOP的体系结构         四、AOP原理         五、AOP能做什么         六、AOP案例-- 使用AOP模拟事务...
    99+
    2023-10-23
    java spring 开发语言
  • Spring基础篇之初识DI和AOP
    前言  作为从事java开发的码农,Spring的重要性不言而喻,你可能每天都在和Spring框架打交道。Spring恰如其名的,给java应用程序的开发带了春天般的舒爽感觉。Spring,可以说是任何一个java开发者通往技术高阶的必备基...
    99+
    2023-05-30
  • 一篇文章带你详解Spring的AOP
    目录1、AOP 什么?2、需求3、解决办法1:使用静态代理第一步:创建 UserService 接口第二步:创建 UserService的实现类第三步:创建事务类 MyTransac...
    99+
    2024-04-02
  • Java SpringBoot实现AOP
    目录1、AOP基本总结2、常用方法3、增强类型4、示例说明5、结果展示1、AOP基本总结 连接点(JoinPoint): 连接点是程序运行的某个阶段点,如方法调用、异常抛出等 切入...
    99+
    2024-04-02
  • Java spring AOP基础
    目录一、AOP概述二、AOP相关语述三、AOP与动态代理3.1JDK动态代理3.2CGLib动态代理3.3两者对比总结一、AOP概述 AOP,即面向切面编程,简单来说就是将代码中重复...
    99+
    2024-04-02
  • Java Spring AOP详解
    目录1.什么是AOP?2.AOP在Spring中的作用3.使用Spring实现AOP方式一:使用Spring的接口方法二:使用自定义类来实现方法三:使用注解实现总结1.什么是AOP?...
    99+
    2024-04-02
  • JAVA开发(AOP之ProceedingJoinPoint)
    我们在开发过程中经常使用到自定义注解来实现在一些类或者方法执行过程中切面,统一实现某些业务操作。例如自定义注解 import java.lang.annotation.Documented;import java.lang.annotat...
    99+
    2023-09-20
    java 微服务 Powered by 金山文档
  • 一篇文章带你了解Spring AOP 的注解
    目录1、xml 的方式实现 AOP①、接口 UserService②、实现类 UserServiceImpl③、切面类,也就是通知类 MyAspect④、AOP配置文件 applic...
    99+
    2024-04-02
  • 怎样解读Java Spring AOP
    本篇文章为大家展示了怎样解读Java Spring AOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,A...
    99+
    2023-06-21
  • 详细解读Java Spring AOP
    一、对AOP的初印象 首先先给出一段比较专业的术语(来自百度): 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式...
    99+
    2024-04-02
  • Java的Spring AOP怎么用
    这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为...
    99+
    2023-06-29
  • 在java中aop是什么
    AOP是面向切面编程,可以说是OOP的补充和完善,而AOP技术把软件系统分为两个部分:核心关注点和横切关注点,AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。...
    99+
    2024-04-02
  • 一篇文章从无到有详解Spring中的AOP
    前言 AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成...
    99+
    2024-04-02
  • Java的Spring AOP详细讲解
    目录什么是AOP&作用AOP的动态代理技术基于JDK的动态代理cglib动态代理AOP相关概念AOP开发明确事项需要编写的内容AOP技术实现的内容AOP 底层使用哪种代理方式...
    99+
    2024-04-02
  • JAVA:面向切面编程AOP
    一、定义         把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展         也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理         对业务逻辑的各个部分进行了隔离...
    99+
    2023-09-12
    java AOP
  • Java Spring AOP该怎么理解
    这篇文章给大家介绍Java Spring AOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的...
    99+
    2023-06-22
  • 初识Java篇
    1.介绍Java语言 1.1Java是什么         Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。         不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完...
    99+
    2023-10-26
    java 开发语言
  • Java核心库实现AOP过程
    这篇文章是关于Java的一个疑难杂症,通过利用Java核心库实现简单的AOP方法,并把实例代码做了分析对照,以下是全部内容:Spring是一个十分火热开源框架,而AOP(面向切面编程)则是Spring最重要的概念之一,为了更好的理解和学习A...
    99+
    2023-05-30
    java 核心库 aop
  • Java Spring AOP之PointCut案例详解
    目录一、PointCut接口二、ClassFilter接口三、MethodMatcher接口总结一、PointCut接口 package org.springframewor...
    99+
    2024-04-02
  • 【Java 基础篇】Java List 详解
    文章目录 导言一、List 概述二、ArrayList三、LinkedList四、Vector总结 导言 在Java的集合框架中,List接口是一个有序、可重复的集合,它扩展了Coll...
    99+
    2023-09-11
    java list 数据结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作