spring的面向切面编程,aspectJ实现aop的操作,配置文件和注解形式,四大通知

本文详细介绍了如何使用AspectJ实现面向切面编程(AOP),包括引入必要的jar包、配置Spring约束,以及通过XML和注解两种方式配置切入点、切面和通知。提供了具体的代码示例,展示了前置通知和环绕通知的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

aspectJ实现aop操作,引入jar包和约束:
链接:https://pan.baidu.com/s/1dESiSVYNdx_H44B7koslkw
提取码:42tb
配置文件形式:
先创建两个方法Book(被增强类)和MyBook(增强类),aop就是不改变源码实现增强类应用到被增强类上,实现方法的增强。

(1)先创建Book和MyBook的bean对象

<bean id="book" class="aspectj.Book"></bean>
<bean id="mybook" class="aspectj.MyBook"></bean>

(2)前提要引入AOP的约束   然后下面写的是增强的操作:
全部要写在<aop:config></aop:config><aop:config>

	(3)一共有两部             第一步     配置切入点:                    切入点:那个被增强类的对象      这里的Book是被增强
	<aop:pointcut expression="execution(* aspectj.Book.*(..))" id="pointcut1"/>
	这里的pointcut:意思是切入点的意思          point:点           cut:切入                 expression:这里的意思是要写一个函数表达式的格式
	后面的id 意思把切入点起一个名字
	
	
	(4)第二步   配置切面                   切面:就是把                  增强                 应用到方法上面去
	<aop:aspect ref="mybook">
	aspect:切面的意思            后面跟的ref:意思是  指定那个增强     写的是那个     增强类          的对象        这里的MyBook是增强类
	
	<!--后面在配置增强的类型         是前置还是后置...-->
	<aop:before method="before1" pointcut-ref="pointcut1"/>
	before:前置的类型
	method:方法的意思  这里的意思是  增强的方法是哪一个?       另一种理解 在增强类里面使用哪一个方法作为前置增强
	pointcut-ref:意思是把哪一个增强应用到切入点上    如果不写  只是显示增强  并没有应用方法上
	
	
	
	</aop:aspect>

</aop:config>

execution常用的表达式:

常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
*:任意的什么public private  后面加空格 后面写要增强 方法 的全路径  (..):的意思是里面有参数也包括
(1)execution(* cn.itcast.aop.Book.add(..))

(2)execution(* cn.itcast.aop.Book.*(..))    *(..):表示类中所有方法要增强

(3)execution(* *.*(..))   **(..)所有类中 所有方法要增强

(4)execution(* save*(..))   save*(..)方法是save开头的都增强  例如:saveadd()

写一个单词execution()

做法 例如:

<?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" 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"> <!-- bean definitions here -->

	<bean id="book" class="aspectj.Book"></bean>
	<bean id="mybook" class="aspectj.MyBook"></bean>

	<!-- 配置aop操作 -->
	<aop:config>
		<!-- 配置切入点 -->        
			<aop:pointcut expression="execution(* aspectj.Book.*(..))" id="pointcut1"/><!-- expression:表达式的意思   id:的意思是给切入点起个名字-->
		<!-- 配置切面 :把增强应用到具体方法上面的过程为切面                    把哪个增强用到切入点上-->
			<aop:aspect ref="mybook"><!-- ref="里面写的是哪个增强 是增强的对象" -->
	</aop:config>
</beans>

注解形式:

第一步:配置<bean>并创建增强和被增强的对象       也可以用注解的方式配置

第二步:配置aop的一个事务的管理     相当于开启注解扫描
<!-- 开启aop操作   这里也就是开启注解    autoproxy:自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>     很好记因为是aop用到的是aspectj所以<aop:aspectj 直接找就可以


(1)然后配置增强类        因为被增强类的代码不能动
配置 之前要先写一个注解  @Aspect      就相当于开启了一个增强的配置
@Aspect
public class MyBook2 {

(2)随后是配置         那个           方法              上 的            那个            通知属性
@Before(value="execution(* aspectj.Book2.*(..))")
	public void before1() {
		System.out.println("前置增强");
	}

例如:同理//@Before(value="execution(* aspectj.Book2.*(..))")

做法 例如:MyBook2是增强类

package aspectj;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyBook2 {
	@Before(value="execution(* aspectj.Book2.*(..))")
	public void before1() {
		System.out.println("前置增强");
	}
}

其他通知:
在这里插入图片描述
配置环绕通知:

<!-- 配置环绕通知 -->
<aop:around method="around1" pointcut-ref="pointcut1"/> 这些于其他配置都一样

不同的地方是

//环绕通知 ProceedingJoinPoint: 该方法里面可以加参数进行调用该方法      利用里面的对象可以调用 被 增强的方法 add()方法
	public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
		//方法之前
		System.out.println("环绕之前");
		//执行被增强的方法
		proceedingJoinPoint.proceed();//可以调用被增强的方法           就是add()方法    不用set什么的调用或private引入类
		
		//方法之后
		System.out.println("环绕之后");
	}

通知优先级:
前置通知
环绕通知方法前
方法
环绕通知方法后
后置通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值