百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

这篇关于Spring之SSM框架的笔记你真得看看,写的非常详细了

ccwgpt 2024-09-14 00:11 69 浏览 0 评论

什么是AOP

AOP是Aspect Oriented Programming的缩写,意思为面向切面编程,是通过预编译的方法和运行期动态代理实现程序的统一维护的一种技术

AOP是OOP(面向对象)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP的作用及其优势

作用

在程序运行期间,在不修改源码的情况下对方法进行功能增强

优势

减少重复代码,提高开发效率,并且便于维护

AOP的底层实现

实际上,在AOP的底层是通过Spring提供的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。

AOP的动态代理技术

常用的动态代理技术:

  • JDK代理:基于接口的动态代理技术
  • cglib:基于父类的动态代理技术

AOP相关概念

Spring的AOP实现底层就是对动态代理的代码进行了封装,封装后我们只需要对关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。

相关术语

  • Target(目标对象):代理的目标对象
  • Proxy(代理):一个被AOP织入增强后,就产生一个结果代理类
  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
  • Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截定义
  • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知
  • Aspect(切面):是切入点和通知(引介)的结合
  • Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

AOP开发的明确事项

需要编写的内容

  • 编写核心业务代码(目标类的目标方法)
  • 编写切面类,切面中有通知(增强功能的方法)
  • 在配置文件中织入关系,即将哪些通知与哪些连接点进行结合

AOP技术实现的内容

Spring框架监控切入点方法的执行。一旦切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。

AOP底层使用哪种代理方式

在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式

基于XML的AOP开发

快速入门

  1. 导入AOP相关的坐标
 <dependency>
                   <groupId>org.springframework</groupId>
                   <artifactId>spring-context</artifactId>
                   <version>5.2.5.RELEASE</version>
               </dependency>
       <dependency>
                   <groupId>org.aspectj</groupId>
                   <artifactId>aspectjweaver</artifactId>
                   <version>1.8.4</version>
               </dependency>
               <dependency>
                   <groupId>junit</groupId>
                   <artifactId>junit</artifactId>
                   <version>4.12</version>
               </dependency>

  1. 创建目标接口和目标类(内部有切点)
 public interface TargetInterface {
           void save();
}

 public class Target implements TargetInterface {
           @Override
           public void save() {
               System.out.println("意大利炮准备就绪!");
           }
}

  1. 创建切面类(内部有增强方法)
 public class MyAspect {

           public void before(){
               System.out.println("我是前置方法。。。。。。。");
           }
}

  1. 将目标类和切面类的对象创建权交给spring
            <!--目标对象-->
           <bean id="target" class="zyh.com.aop.Target"></bean>

           <!--切面对象-->
           <bean id="myAspect" class="zyh.com.aop.MyAspect"></bean>

  1. 在applicationContext.xml中配置织入关系
        <!--配置织入:告诉spring框架 哪些方法(切点)需要进行哪些增强(前置,后置...)-->
           <aop:config>
               <!--声明切面-->
               <aop:aspect ref="myAspect">
                   <!--切面:切点+通知 当访问save方法时,会通过myAspect中的before方法进行前置增强-->
                   <aop:before method="before" pointcut="execution(public void zyh.com.aop.Target.save())"/>
               </aop:aspect>
           </aop:config>

  1. 测试代码
       @RunWith(SpringJUnit4ClassRunner.class)
       @ContextConfiguration("classpath:applicationContext.xml")
       public class AopTest {
           @Autowired
           @Qualifier("target")
           private TargetInterface target;

           @Test
           public void  t1(){
               target.save();
           }
       }

切点表达式的写法

表达式语法:excution([修饰符] 返回值类型 包名.类名.方法名(参数))

  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用*代表任意
  • 包名与类名之间一个点,代表当前包下的类,两个点…表示当前包及其子包下的类
  • 参数列表可以使用两个…表示任意个数,任意类型的参数列表

通知类型

  • 前置通知: aop:before 切入点方法之前执行
  • 后置通知:aop:after-returning 切入点方法之后执行
  • 环绕通知:aop:around 切入点方法之前和之后都执行//ProceedingJoinPoint:正在执行的连接点====切点public Object around(ProceedingJoinPoint pjp)throws Throwble{System.out.println(“环绕前增强”);Object proceed = pjp.proceed();//切点方法System.out.println(“环绕后增强”);return proceed;}
  • 异常抛出通知:aop:throwing 指定增强方法出现异常时执行
  • 最终通知:aop:after 无论增强方法是否有异常都执行

基于注解的AOP开发

快速入门

  1. 创建目标接口和目标类(内部有切点)
  2. 创建切面类(内部有增强方法)
  3. 将目标类和切面类的创建权交给spring
       @Component("target")
       public class Target implements TargetInterface {
           @Override
           public void save() {
               System.out.println("意大利炮准备就绪!");
           }
       }

       @Component("myAspect")
       public class MyAspect {

           public void before(){
               System.out.println("我是前置方法。。。。。。。");
           }
       }

  1. 在切面类中使用注解配置织入关系
       @Component("myAspect")
       @Aspect//标注当前MyAspect是一个切面类
       public class MyAspect {

           @Before(value = "execution(* zyh.com.anno.*.*(..))")
           public void before(){
               System.out.println("我是前置方法。。。。。。。");
           }
       }

  1. 在配置文件中开启组件扫描和AOP的自动代理
   <?xml version="1.0" encoding="UTF-8"?>
       <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:aop="http://www.springframework.org/schema/aop"
              xmlns:context="http://www.springframework.org/schema/context"
              xsi:schemaLocation="
              http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       ">
           <!--组件扫描-->
           <context:component-scan base-package="zyh.com.anno"/>
           <!--aop自动代理-->
           <aop:aspectj-autoproxy/>

       </beans>

  1. 测试
 @RunWith(SpringJUnit4ClassRunner.class)
       @ContextConfiguration("classpath:applicationContext-anno.xml")
       public class AnnoTest {
           @Autowired
           @Qualifier("target")
           private TargetInterface target;

           @Test
           public void  t1(){
               target.save();
           }
       }

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

相关推荐

十分钟让你学会LNMP架构负载均衡(impala负载均衡)

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

AGV仓储机器人调度系统架构(agv物流机器人)

系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...

远程热部署在美团的落地实践(远程热点是什么意思)

Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...

springboot搭建xxl-job(分布式任务调度系统)

一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...

大模型:使用vLLM和Ray分布式部署推理应用

一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...

国产开源之光【分布式工作流调度系统】:DolphinScheduler

DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...

简单可靠高效的分布式任务队列系统

#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...

虚拟服务器之间如何分布式运行?(虚拟服务器部署)

  在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...

一文掌握 XXL-Job 的 6 大核心组件

XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...

京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?

京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...

企业级项目组件选型(一)分布式任务调度平台

官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

SpringBoot整合ElasticJob实现分布式任务调度

介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...

SpringBoot任务调度:@Scheduled与TaskExecutor全面解析

一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...

取消回复欢迎 发表评论: