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

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

ccwgpt 2024-09-14 00:11 49 浏览 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相关技术文章或行业资讯,欢迎大家关注和转发文章!

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: