spring AOP——通过配置文件实现

目录

说明

本例子不是web项目。

配置applicationContext.xml

配置文件,代码片.

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">

	<!-- 切面类bean -->
	<bean id="aspect" class="text3_AOP_text3.MyAspect"></bean>

	<!-- 目标对象 -->
	<bean id="studenttarget" class="text3_AOP_text3.StudentImpl"></bean>

	<!-- 定义AOP切面,切入点,通知 -->
	<aop:config>
		<aop:aspect id="aspectAOP" ref="aspect">
			<!-- 切点 -->
			<aop:pointcut id="piontcut" expression="execution(* text3_AOP_text3.StudentImpl.*(..))"/>
			<!--  使用逻辑运算符and,限定参数是注解-->
<!--      	expression="execution(* text3_AOP_text3.*.*(..)) and -->
<!--         						@annotation(text3_AOP_text3.MyAnnotation)" /> -->
			<!-- 前置通知方法,引入切点 -->
			<aop:before method="before" pointcut-ref="piontcut"/>
			<!-- 环绕通知方法 -->
			<aop:around method="around" pointcut-ref="piontcut"/>
			<!-- 返回后通知方法 -->
			<aop:after-returning method="afterReturning" pointcut-ref="piontcut" returning="re"/>
			<!-- 异常通知方法 -->
			<aop:after-throwing method="afterThrowing" pointcut-ref="piontcut" throwing="e"/>
			<!-- 后通知通知方法 -->
			<aop:after method="after" pointcut-ref="piontcut"/>
			
			<!-- 环绕通知带参数的方法 -->
			<aop:around method="aroundadd"
				pointcut="execution(* text3_AOP_text3.StudentImpl.addStudent(String))
							and args(name)" />

			<!-- 转向操作,访问匹配 text3_AOP_text3.People.*(+)的方法,转向执行实了FBI接口的类FBIImpl -->
			<aop:declare-parents types-matching="text3_AOP_text3.People.*(+)"
				implement-interface="text3_AOP_text3.FBI" default-impl="text3_AOP_text3.FBIImpl"/>
		</aop:aspect>
	</aop:config>
</beans>


说明:
匹配的目标对象都将通过切面类,在一个切面类中定义各种类型的通知
注意有五种通知+一个转向操作

切面类:MyAspect.java

切面类:MyAspect.java,代码片.

package text3_AOP_text3;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {

	// 前置通知方法
	public void before(JoinPoint joinPoint) {
		System.out.println("前置通知---方法名: "
							+joinPoint.getSignature().getName());
	}

	// 返回后通知方法
	public void afterReturning(JoinPoint joinPoint, Object re) {
		System.out.println("后置通知---方法名: "
							+joinPoint.getSignature().getName()
							+", 返回参数re: " + re);
	}

	// 异常通知方法
	public void afterThrowing(JoinPoint joinPoint, Throwable e) {
		System.out.println("异常通知: " 
							+ "出现异常的方法名: "+joinPoint.getSignature().getName() 
							+ ", 异常信息e: " + e.getMessage());
		System.exit(0);
	}

	// 后通知方法
	public void after(JoinPoint joinPoint) {
		System.out.println("后通知---方法名: "
							+joinPoint.getSignature().getName());
	}

	// 环绕通知方法
	public Object around(ProceedingJoinPoint joinPoint) {
		Object re = null;
		try {
			System.out.println("环绕通知前");
			re = joinPoint.proceed();
			System.out.println("环绕通知后");
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return re;
	}

	// 有参数的环绕通知方法,执行的上下文ProceedingJoinPoint
	public Object aroundInit(ProceedingJoinPoint joinPoint, String name) {
		System.out.println("姓名:" + name);
		Object re = null;
		try {
			System.out.println("环绕通知前");
			re = joinPoint.proceed();
			System.out.println("环绕通知后");
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return re;
	}

}

说明:

--------------------------------------------------------------------------------------------------------------------------------------------
	 * 了解一下spring aop的两个接口的主要方法:  
	 * 1)JoinPoint 
	 * 		java.lang.Object[] getArgs():获取连接点方法的参数集合 
	 * 		Signature getSignature() :获取连接点的方法对象;
	 * 		java.lang.Object getTarget() :获取连接点所在类的目标对象; 
	 * 		java.lang.Object getThis():获取切面对象本身;  
	 * 2)ProceedingJoinPoint 
	 * 	ProceedingJoinPoint继承JoinPoint子接口,新增了两个用于执行连接点方法的方法:
	 * 		java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
	 * 		java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。 
	 * 

总结

	1. 使用配置的方式来实现AOP相对于API方式更加方便,更易于管理,用匹配的的方式,可以对一类目标对象进行管理。
**引用包是最大的困难(一步一步来)**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOPSpring框架中的一个重要模块,它提供了面向切面编程(AOP)的支持。AOP是一种编程思想,它可以在不改变原有代码的情况下,通过在程序运行时动态地将代码“织入”到现有代码中,从而实现对原有代码的增强。 Spring AOP提供了基于注解的AOP实现,使得开发者可以通过注解的方式来定义切面、切点和通知等相关内容,从而简化了AOP的使用。 下面是一个基于注解的AOP实现的例子: 1. 定义切面类 ```java @Aspect @Component public class LogAspect { @Pointcut("@annotation(Log)") public void logPointcut() {} @Before("logPointcut()") public void beforeLog(JoinPoint joinPoint) { // 前置通知 System.out.println("执行方法:" + joinPoint.getSignature().getName()); } @AfterReturning("logPointcut()") public void afterLog(JoinPoint joinPoint) { // 后置通知 System.out.println("方法执行完成:" + joinPoint.getSignature().getName()); } @AfterThrowing(pointcut = "logPointcut()", throwing = "ex") public void afterThrowingLog(JoinPoint joinPoint, Exception ex) { // 异常通知 System.out.println("方法执行异常:" + joinPoint.getSignature().getName() + ",异常信息:" + ex.getMessage()); } } ``` 2. 定义业务逻辑类 ```java @Service public class UserService { @Log public void addUser(User user) { // 添加用户 System.out.println("添加用户:" + user.getName()); } @Log public void deleteUser(String userId) { // 删除用户 System.out.println("删除用户:" + userId); throw new RuntimeException("删除用户异常"); } } ``` 3. 在配置文件中开启AOP ```xml <aop:aspectj-autoproxy/> <context:component-scan base-package="com.example"/> ``` 在这个例子中,我们定义了一个切面类LogAspect,其中通过@Aspect注解定义了一个切面,通过@Pointcut注解定义了一个切点,通过@Before、@AfterReturning和@AfterThrowing注解分别定义了前置通知、后置通知和异常通知。 在业务逻辑类中,我们通过@Log注解标注了需要增强的方法。 最后,在配置文件中,我们通过<aop:aspectj-autoproxy/>开启了AOP功能,并通过<context:component-scan>扫描了指定包下的所有组件。 这样,当我们调用UserService中的方法时,就会触发LogAspect中定义的通知,从而实现对原有代码的增强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值