AOP中xlm配置和注解配置

2023-11-10 08:20
文章标签 配置 注解 aop xlm

本文主要是介绍AOP中xlm配置和注解配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念:Aspect Oriented Programming 面向切面编程

面向切面编程时一种改编成思想。就是通过预编译和运行期的动态代理,实现程序功能的统一维护。spring是对这个思想的实现。
动态代理:简而言之就是在不修改源代码的情况下,对其中的方法进行增强,实现调用者和实现者的解耦。常用的动态代理有:

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

对一些概念理解:

  1. Target(目标对象)要增强的对象
  2. Proxy(代理)增强后的对象。
  3. Joinpoint(连接点)要增强的方法
  4. Pointcut(切点)被增强的方法
  5. Advice(通知)增强方法
  6. Aspect(切面)通知+切点。就是增强后的方法。
  7. Weaving(织入)通知和切点相结合的过程。创建增强的代理对象的过程。

基于JDK

这个代理基于Java的反射机制实现的。主要涉及到java.lang.reflect包中的Proxy和InvocationHandler。
底层代码简单写了一下

public class Proxy动态增强 {public static void main(String[] args) {/** jdk的动态增强,基于接口。*///创建要增强的对象final Target target = new Target ();//创建增强类,存的是增强的功能final Aspect aspect = new Aspect();//使用动态代理将要增强的对象和功能组织到一块儿Egg ss = (Egg) Proxy.newProxyInstance(target.getClass().getClassLoader(),//目标对象的类加载器target.getClass().getInterfaces(),//目标对象相同接口字节码对象数组new InvocationHandler(){//调用代理对象的方法,实际执行的都是invoke方法。public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//调用增强功能aspect.before();//执行目标原有方法method.invoke(target ,args);//调用增强功能aspect.after();return null;}});ss.fight();}
}
浅谈一下为什么用final修饰

在jdk1.8以后就不用了,之前需要。
main方法执行开始,进栈内存,成员变量进栈内存,常量进常量池。new对象的时候,对象在对内存。栈内存存储的是new出来的对象的地址值。在堆内存的对象引用被赋值的成员变量时,是不可以的。就相当于从堆内存找栈内存的数据。而在方法执行完毕后,成员变量随着方法的结束而消失,到那时堆内存的对象暂时不会消失。所以强大编码软件就会报错。被final修饰的变量为常量,存在于常量池中。常量池中的数据随着程序的结束而消失,所以堆内存的对象在寻找它需要的变量时,可以直接从常量池中寻找。所以用final修饰。
1.8以后,jdk在编译.class文件的时候就会加上final。所以不用。

1 基于xml

  1. 导入坐标spring-context和context依赖的aop

     <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><!-- aspectj的织入 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></dependency>
    
  2. 导入aop的命名空间

     <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
    

导入命名空间

  1. 在配置文件中配置织入关系

     <!--目标对象--><bean id="target" class="cn.itcast.jdkProxyXml.Target"/><!--切面对象--><bean id="myAspect" class="cn.itcast.jdkProxyXml.MyAspect"/><!--配置织入:告诉spring哪些方法(切点)需要哪些增强(前置、后置... ... )--><aop:config><!--声明切面类--><aop:aspect ref="myAspect"><aop:pointcut id="myPoint" expression="execution(public void cn.itcast.jdkProxyXml.Target.save())"/><!--生成切面:切点+通知--><aop:after method="after" pointcut-ref="myPoint"/><aop:around method="around" pointcut-ref="myPoint"/><aop:before method="before" pointcut-ref="myPoint"/></aop:aspect></aop:config>
    </beans>
    

配置织入
黄色箭头为提取切点表达式。
蓝色为通知类型
红色为切点表达式的写法
切点表达式的写法
通知的类型

浅谈为什么用aspectjweaver这个jar包

spring中已经有aop的jar包了,为什么还要引入aspectjweaver这个。简单的说就是后面这个比spring自己坐的jar包要好。
如果仅仅用xlm的配置方法,原生的aop就可以了,但是要使用注解,就的引入aspectjweaver这个jar包。

2 基于注解

在配置文件中配置组键扫描和自动代理。

<!--组件扫描-->
<context:component-scan base-package="com.itheima.aop"/><!--aop的自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

配置组件扫描和自动代理
注解配置与xml的大同小异
在这里插入图片描述
切点表达式的抽取

@@Component("myAspect")
@Aspect
public class MyAspect {@Before("MyAspect.myPoint()")public void before(){System.out.println("前置代码增强.....");}@Pointcut("execution(* com.itheima.aop.*.*(..))")public void myPoint(){}
}

声明切面类
声明切面类

基于cglib

这篇关于AOP中xlm配置和注解配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381460

相关文章

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

在Spring中配置Quartz的三种方式

《在Spring中配置Quartz的三种方式》SpringQuartz是一个任务调度框架,它允许我们定期执行特定的任务,在Spring中,我们可以通过多种方式来配置Quartz,包括使用​​@Sche... 目录介绍使用 ​​@Scheduled​​ 注解XML 配置Java 配置1. 创建Quartz配置

Kibana的安装和配置全过程

《Kibana的安装和配置全过程》Kibana是一个开源的数据分析和可视化平台,它与Elasticsearch紧密集成,提供了一个直观的Web界面,使您可以快速地搜索、分析和可视化数据,在本文中,我们... 目录Kibana的安装和配置1.安装Java运行环境2.下载Kibana3.解压缩Kibana4.配