广告
返回顶部
首页 > 资讯 > 精选 >Java Spring AOP该怎么理解
  • 855
分享到

Java Spring AOP该怎么理解

2023-06-22 07:06:47 855人浏览 安东尼
摘要

这篇文章给大家介绍Java spring aop该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的

这篇文章给大家介绍Java spring aop该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

    前言

    面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
    即不改变源代码而添加新功能,可插拔的.

    提示:以下是本篇文章正文内容,下面案例可供参考

    一.AOP底层原理

    1.AOP底层使用动态代理

    有接口:jdk动态代理,即创建接口实现类代理对象

    无接口:CGLIB动态代理,即创建子类代理对象

    jdk动态代理的实现

    Java Spring AOP该怎么理解

    创建接口

    package com.vector.spring5;public interface UserDao {    public int add(int a,int b);    public String update(String id);}

    接口实现类

    接口实现类的方法,属于源代码,用aop思想增添新功能时这里不能动!

    package com.vector.spring5;public class UserDaoImpl implements UserDao{    @Override    public int add(int a, int b) {        return a+b;    }    @Override    public String update(String id) {        return id;    }}

    使用JDK动态代理对象,增添新功能

    package com.vector.spring5;import java.lang.reflect.Array;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;public class JDKProxy {    public static void main(String[] args) {        //创建接口实现类代理对象        Class[] interfaces = {UserDao.class};        UserDaoImpl userDao = new UserDaoImpl();        UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));        int result = dao.add(1,2);        System.out.println("result: "+result);    }}//创建代理对象class UserDaoProxy implements InvocationHandler{    //有参构造传递增强对象    private Object obj;    public UserDaoProxy(){};    public UserDaoProxy(Object obj){        this.obj=obj;    }    //增强的逻辑    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //方法之前        System.out.println("方法之前执行: "+method.getName()+":传递的参数: "+ Arrays.toString(args));        //被增强的方法执行        //可以根据method.getName()判断选择增强        Object res = method.invoke(obj,args);        //方法之后        System.out.println("方法之后执行: "+obj);        return res;    }}

    Java Spring AOP该怎么理解

    jdk代理图像解析

    Java Spring AOP该怎么理解

    Java Spring AOP该怎么理解

    二.AOP术语

    1.连接点

    类里可以被增强的方法,称为连接点.

    2.切入点

    类中实际被增强的方法,成为切入点.

    3.通知(增强)

    (1)实际被增强的方法中的逻辑部分称为通知(增强).

    (2)通知包含:前置通知,后置通知,环绕通知,异常通知,最终通知

    4.切面

    把增强应用到切入点的过程称为切面

    三.AOP 操作(准备工作)

    Spring 框架一般都是基于 AspectJ 实现 AOP 操作

    (1)AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作

    Maven准备

    <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjweaver</artifactId>            <version>1.9.8.RC1</version>        </dependency>

    方式一:使用Spring的接口实现增添功能

    实现组合crud和日志功能结合

    applicationContext.xml

        <context:component-scan base-package="com.vector"/>    <aop:config><!--        切入点: expression:表达式 execution(要执行的位置!* * * * *)-->        <aop:pointcut id="pointcut" expression="execution(* com.vector.service.UserServiceImpl.*(..))"/><!--        执行环绕增加!-->        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>        <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>    </aop:config>

    log.java

    package com.vector.log;import org.springframework.aop.MethodBeforeAdvice;import org.springframework.stereotype.Component;import java.lang.reflect.Method;@Component("log")public class Log implements MethodBeforeAdvice {    //method: 要执行的目标对象的方法    //args: 参数    //target: 目标对象    @Override    public void before(Method method, Object[] args, Object target) throws Throwable {        System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");    }}

    userService.java

    package com.vector.service;public interface UserService {    public void add();    public void delete();    public void update();    public void query();}

    userServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    Java Spring AOP该怎么理解

    方式二:自定义类

    DiyPoint.java

    package com.vector.diy;import org.springframework.stereotype.Component;@Component("diyPointCut")public class DiyPointCut {    public void before(){        System.out.println("===方法执行前===");    }    public void after(){        System.out.println("===方法执行后===");    }}

    UserServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    applicationContext.xml

        <aop:config><!--        自定义切面,ref要引用的类-->        <aop:aspect ref="diyPointCut"><!--            切入点-->            <aop:pointcut id="pointcut" expression="execution(* com.vector.service.UserServiceImpl.*(..))"/><!--            通知-->            <aop:before method="before" pointcut-ref="pointcut"/>            <aop:after method="after" pointcut-ref="pointcut"/>        </aop:aspect>    </aop:config>

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    Java Spring AOP该怎么理解

    方式三:全注解配置实现

    UserServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    AnnotationPointCut.java

    package com.vector;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.springframework.stereotype.Component;//标注这个类是一个切面@Aspect@Component("annotationPointCut")//开启aop注解驱动@EnableAspectJAutoProxypublic class AnnotationPointCut {    @Before("execution(* com.vector.service.UserServiceImpl.*(..))")    public void before(){        System.out.println("===方法执行前===");    }    @After("execution(* com.vector.service.UserServiceImpl.*(..))")    public void after(){        System.out.println("===方法执行后===");    }}

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    Java Spring AOP该怎么理解

    关于Java Spring AOP该怎么理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    --结束END--

    本文标题: Java Spring AOP该怎么理解

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

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

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

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

    下载Word文档
    猜你喜欢
    • Java Spring AOP该怎么理解
      这篇文章给大家介绍Java Spring AOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的...
      99+
      2023-06-22
    • 怎样解读Java Spring AOP
      本篇文章为大家展示了怎样解读Java Spring AOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,A...
      99+
      2023-06-21
    • Java Spring AOP详解
      目录1.什么是AOP?2.AOP在Spring中的作用3.使用Spring实现AOP方式一:使用Spring的接口方法二:使用自定义类来实现方法三:使用注解实现总结1.什么是AOP?...
      99+
      2022-11-12
    • Java的Spring AOP怎么用
      这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为...
      99+
      2023-06-29
    • 详细解读Java Spring AOP
      一、对AOP的初印象 首先先给出一段比较专业的术语(来自百度): 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式...
      99+
      2022-11-12
    • Java的Spring AOP详细讲解
      目录什么是AOP&作用AOP的动态代理技术基于JDK的动态代理cglib动态代理AOP相关概念AOP开发明确事项需要编写的内容AOP技术实现的内容AOP 底层使用哪种代理方式...
      99+
      2022-11-13
    • Java Spring之基于注解的AOP怎么配置
      本篇内容主要讲解“Java Spring之基于注解的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之基于注解的AOP怎么配置”吧!1 环境搭建1.1 第一步:...
      99+
      2023-07-05
    • Java Spring之XML的AOP怎么配置
      本篇内容主要讲解“Java Spring之XML的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之XML的AOP怎么配置”吧!1 环境搭建示例:在学习 spr...
      99+
      2023-07-05
    • Java Spring AOP之PointCut案例详解
      目录一、PointCut接口二、ClassFilter接口三、MethodMatcher接口总结一、PointCut接口 package org.springframewor...
      99+
      2022-11-12
    • 非Spring管理Bean怎么添加AOP
      这篇文章主要为大家展示了“非Spring管理Bean怎么添加AOP”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“非Spring管理Bean怎么添加AOP”这篇文...
      99+
      2022-10-19
    • Spring-AOP怎么自动创建代理
      本篇内容主要讲解“Spring-AOP怎么自动创建代理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring-AOP怎么自动创建代理”吧!实例代码已托管到Github—> https:...
      99+
      2023-06-20
    • Java Spring AOP源码解析之事务实现原理
      目录不用Spring管理事务?编程式事务管理使用PlatformTransactionManager使用TransactionTemplate声明式事务管理使用@Transactio...
      99+
      2022-11-12
    • @Around注解怎么在Spring AOP中使用
      这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务...
      99+
      2023-06-06
    • 深入理解spring的AOP机制原理
      前言在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为...
      99+
      2023-05-31
      spring aop sprin
    • Java Spring AOP源码解析中的事务实现原理是什么
      这篇文章将为大家详细讲解有关Java Spring AOP源码解析中的事务实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。不用Spring管理事务?让我们先来...
      99+
      2023-06-22
    • 怎么在spring中实现一个aop注解
      今天就跟大家聊聊有关怎么在spring中实现一个aop注解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。注解方式实现aop我们主要分为如下几个步骤:  1.在切面类(为切点服务的类)...
      99+
      2023-05-31
      spring aop
    • Spring AOP标签怎么使用
      这篇文章主要介绍“Spring AOP标签怎么使用”,在日常操作中,相信很多人在Spring AOP标签怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP标签怎么使用”的疑惑有所帮助!...
      99+
      2023-06-02
    • spring-AOP 及 AOP怎么获取request各项参数
      这篇文章主要介绍“spring-AOP 及 AOP怎么获取request各项参数”,在日常操作中,相信很多人在spring-AOP 及 AOP怎么获取request各项参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
      99+
      2023-06-20
    • Java内存模型该怎么理解
      这篇文章主要讲解了“Java内存模型该怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java内存模型该怎么理解”吧!1.为什么会误解首先,我们先来分析一下问什么很多人,甚至是大多数人...
      99+
      2023-06-16
    • 如何理解Spring AOP的实现机制
      这篇文章将为大家详细讲解有关如何理解Spring AOP的实现机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AOP(Aspect Orient Programming),一般称为面向切面...
      99+
      2023-06-16
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作