我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java Spring AOP该怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java Spring AOP该怎么理解

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

    下载Word文档

    猜你喜欢

    Java Spring AOP该怎么理解

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

    怎样解读Java Spring AOP

    本篇文章为大家展示了怎样解读Java Spring AOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect
    2023-06-21

    Java的Spring AOP怎么用

    这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通
    2023-06-29

    Java Spring之基于注解的AOP怎么配置

    本篇内容主要讲解“Java Spring之基于注解的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之基于注解的AOP怎么配置”吧!1 环境搭建1.1 第一步:
    2023-07-05

    Java Spring之XML的AOP怎么配置

    本篇内容主要讲解“Java Spring之XML的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之XML的AOP怎么配置”吧!1 环境搭建示例:在学习 spr
    2023-07-05

    Spring-AOP怎么自动创建代理

    本篇内容主要讲解“Spring-AOP怎么自动创建代理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring-AOP怎么自动创建代理”吧!实例代码已托管到Github—> https://g
    2023-06-20

    深入理解spring的AOP机制原理

    前言在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为
    2023-05-31

    @Around注解怎么在Spring AOP中使用

    这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务
    2023-06-06

    Java Spring AOP源码解析中的事务实现原理是什么

    这篇文章将为大家详细讲解有关Java Spring AOP源码解析中的事务实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。不用Spring管理事务?让我们先来看一下不用sprin
    2023-06-22

    Spring AOP标签怎么使用

    这篇文章主要介绍“Spring AOP标签怎么使用”,在日常操作中,相信很多人在Spring AOP标签怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP标签怎么使用”的疑惑有所帮助!
    2023-06-02

    Java内存模型该怎么理解

    这篇文章主要讲解了“Java内存模型该怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java内存模型该怎么理解”吧!1.为什么会误解首先,我们先来分析一下问什么很多人,甚至是大多数人
    2023-06-16

    怎么在spring中实现一个aop注解

    今天就跟大家聊聊有关怎么在spring中实现一个aop注解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。注解方式实现aop我们主要分为如下几个步骤:  1.在切面类(为切点服务的类)
    2023-05-31

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录