首页 > 编程语言 >Spring_202311_21_2 2. AOP面向切面编程

Spring_202311_21_2 2. AOP面向切面编程

时间:2023-11-21 12:35:00浏览次数:40  
标签:21 Spring 202311 bboy 切面 UserService import com public

Spring_202311_21_2 2. AOP面向切面编程

AOP:全称是 Aspect Oriented Programming 即:面向切面编程。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
即当需要扩展功能时,传统方式采用纵向继承方式实现。但这种方式有很多缺点。 比如:父类方法名称改变时,子类也要修改。给多个方法扩展功能时,子类也需要修改。 因此,spring的AOP,实际上是采用横向抽取机制,取代传统的纵向继承体系。

  1. AOP术语
    a) 通知、连接点、切入点、切面、引入、目标 等
  2. AOP =>JDK动态代理的方式
    a) 需求:在每个方法执行前输出“此方法开始运行”,在每个方法之后输出“此方法运行结束”
    b) 具体操作步骤:
    image
  • 创建目标类:UserService/UserServiceImpl
package com.bboy.service.impl;

import com.bboy.service.UserService;

/**
 * @类描述:
 * @作者:秦帅
 * @时间:2023/11/21 0021 11:31:52
 */
public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("===========>addUser");
    }

    @Override
    public void updateUser() {
        System.out.println("===========>updateUser");
    }

    @Override
    public void deleteUser() {
        System.out.println("===========>deleteUser");
    }
}

  • 创建切面类:MyLogAspect
package com.bboy.aspect;

/**
 * @类描述:
 * @作者:秦帅
 * @时间:2023/11/21 0021 11:39:45
 */
public class MyLogAspect {
    public void methodsBefore(){
        System.out.println("===========>此方法开始执行");
    }
    public void methodsAfter(){
        System.out.println("===========>此方法执行结束");
    }
}

  • 创建代理类:(目标类与切面类进行结合)
package com.bboy.factory;
//-将目标类与切面类结合

import com.bboy.aspect.MyLogAspect;
import com.bboy.service.UserService;
import com.bboy.service.impl.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @类描述:
 * @作者:秦帅
 * @时间:2023/11/21 0021 11:45:12
 */
public class MyAspectFactory {
    //-: 获取结合之后的目标类
    public static UserService createService() {
        // -1. 目标类
        final UserService userService = new UserServiceImpl();
        // -2. 切面类
        MyLogAspect myLogAspect = new MyLogAspect();
        // -3. jdk动态代理的形式,将目标类与切面类进行结合
        return (UserService) Proxy.newProxyInstance(
                MyLogAspect.class.getClassLoader(),  //-当前类
                userService.getClass().getInterfaces(),//-目标类
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //-: 前执行(调用切面类的方法)
                        myLogAspect.methodsBefore();
                        //-: 执行目标类的方法
                        Object obj = method.invoke(userService, args);
                        //-: 后执行(调用切面类的方法)
                        myLogAspect.methodsAfter();
                        return obj;
                    }
                }
        );


    }

}

  • 创建测试类
package com.bboy.demo;

import com.bboy.factory.MyAspectFactory;
import com.bboy.service.UserService;

/**
 * @类描述:
 * @作者:秦帅
 * @时间:2023/11/21 0021 12:05:30
 */
public class Demo {
    public static void main(String[] args) {
        UserService userService = MyAspectFactory.createService();
        userService.addUser();
        userService.deleteUser();
        userService.updateUser();
    }
}

  • 运行结果
    image

标签:21,Spring,202311,bboy,切面,UserService,import,com,public
From: https://www.cnblogs.com/Qinyyds/p/17846341.html

相关文章

  • Spring5学习随笔-事务属性详解(@Transactional)
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第三章、Spring的事务处理1.什么是事务?事务是保证业务操作完整性的一种数据库机制事务的4特点:ACIDA原子性C一致性I隔离性D持久性2.如何......
  • 用java框架spring boot写一个文件上传
    在SpringBoot中,实现文件上传可以使用SpringFramework提供的MultipartResolver。以下是一个简单的SpringBoot文件上传示例:在POM文件中添加以下依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depend......
  • Spring_2023_11_21_1 使用javaConfig实现DI
    Spring_Aop2023_11_21_1使用javaConfig实现DIjavaConfig,是在Spring3.0开始从一个独立的项目并入到Spring中的。javaConfig可以看成一个用于完成Bean装配的Spring配置文件,即Spring容器,只不过该容器不是XML文件,而是由程序员使用java自己编写的java类。一个类中......
  • springboot jar基本结构
    @[TOC]Jar包的基本概念首先,让我们从JAR包的基本概念开始。JAR,全称JavaArchive,是Java的一种压缩文件格式。它主要用于打包、分发Java类和相关资源,包括Java类文件、资源文件、配置文件以及其他Java应用程序相关文件。与直接编译和运行Java源代码不同,使用JAR包可以更方便地进行应用程......
  • 聊聊如何利用springcloud gateway实现简易版灰度路由
    前言前阵子时间和朋友聊天,他们有个sass微服务,因为之前拆分过细,导致服务不仅调用链路过长,而且浪费服务资源,他们后面做了服务合并的重构,并即将上线。他觉得上线不能直接把线上的租户都全切到重构版的sass微服务,而是需要实现如下的效果他就问我说,有没有啥开源平台可以快速支持,因为......
  • 2023-11-21 {“errcode”:40029,“errmsg”:“invalid code, rid: xxx”} ==》后端保
    今天上午登一下小程序,登录失败,后端调查发现是微信登录的时候报了这个错误:{“errcode”:40029,“errmsg”:“invalidcode,rid:xxx”}原因:后端保存的appsecret和appid与前端的appid不匹配导致。解决方案:更新后端保存的appsecret和appid即可。......
  • springboot中实现上传文件的功能简单示例
    在SpringBoot中实现文件上传可以通过以下步骤:配置文件上传相关的依赖:在项目的pom.xml文件中,添加以下依赖:<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>创建文件上传接口:在......
  • 比较Spring Security6.X 和 Spring Security 5.X的不同
      项目使用了SpringBoot3,因此SpringSecurity也相应进行了升级版本由5.4.5升级到了6.1.5写法上发生了很大的变化,最显著的变化之一就是对WebSecurityConfigurerAdapter类的使用方式的改变。这个类在SpringSecurity中被广泛用于自定义安全配置。以下是主要的差异和写法上......
  • SpringBoot + vue2.0查询所用功能
    导入数据库文件CREATEDATABASE`springboot`/*!40100DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci*//*!80016DEFAULTENCRYPTION='N'*/CREATETABLE`users`(`id`intunsignedNOTNULLAUTO_INCREMENT,`name`varchar(40)CHARACTERSETu......
  • LY1464 [ 20231112 NOIP 模拟赛 T4 ] 序列计数
    题意给定\(n,m\)。求:\(a_1+a_2+...+a_m=n\)\(1^{a_1}\times2^{a_2}\times...\timesm^{a_m}\equivx(\bmodm)\)对于\(x\in[1,m)\)满足上述条件的方案数。Sol注意到下面的式子等价于:\(1\times1\times1...\times2\times2...\time......