spring04 spring中aop思想动态代理实现演示

本文详细阐述了Spring框架中AOP(面向切面编程)的核心思想及其实现原理,包括动态代理与cglib代理机制,介绍了Joinpoint、Pointcut、Advice等关键概念,并通过实例演示了如何将通知织入目标对象中,同时提供了使用注解配置AOP的实践方法。

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

一,spring中的aop思想详解

1.思想:横向重复,纵向抽取 spring 能够为容器中管理对象生成动态代理对象,以前我们使用动态代理,我们需要自己实现,而现在是spring帮助我们生成代理对象

2.spring 实现aop的原理

1.动态代理  (接口实现)2. cglib代理(继承关系)

3.spring aop 中的名词解释就(加强理解)

Joinpoint(连接点)):目标对象中,所有可以增强的方法

Pointcut:切入点 目标对象  已经增强的方法

Adivice :通知 :增强的代码

Target:——目标对象  被代理对象

Weaving:将通知应用到切入点的过程

proxy:代理对象 ,

aspect:切面= 切入点+通知

二.aop 演示

1.准备目标对象

package cn.itcast.service;

public class UserServiceImp  implements UserService{
//目标对象
	@Override
	public void save() {
		System.out.println("保存用户");
		// TODO Auto-generated method stub
		
	}

	@Override
	public void delete() {
		System.out.println("删除用户");
		// TODO Auto-generated method stub
		
	}

	@Override
	public void update() {
		System.out.println("更新用户");
		// TODO Auto-generated method stub
		
	}

	@Override
	public void find() {
		System.out.println("C查找用户");
		// TODO Auto-generated method stub
		
	}
	

}

2.准备通知类

package cn.itcast.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
@Aspect
//表示这是一个通知类
public class MyAdive {
	/*
	 * 前置通知 后置同志 环绕通知 异常拦截通知 后置通知(无论是否出现异常都会调用)
	 */
	// 前置通知
	public void before() {
		System.out.println("这个是前置通知");
	}
//后置通知
	public void afterReturning() {
		System.out.println("这个时后置通知,出现异常不会调用");
	}
//	环绕通知
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("这是环绕通知之前的部分");
		Object proceed= pjp.proceed();
		System.out.println("这是环绕通知后的部分");
		return proceed;
	}
//	异常通知
	public void afterException(){
		System.out.println("抛出异常了");
	}
//	后置通知 出现异常也会执行
	public void after(){
		System.out.println("这是后置通知,即使出现异常也会执行");
	}
}

 

3.将通知织入到目标对象中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframwork.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
	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-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- 1.配置目标对象 -->
	<bean name="userService" class="cn.itcast.service.UserServiceImp"></bean>
	<!-- 2.配置通知对象 -->
	
	<bean name="myAdvice" class="cn.itcast.service.MyAdive"></bean>
	<aop:config>
	<!-- 配置切入点 也就是需要增强的方法  格式如下
	cn.itcast.service.UserServiceImp.save() -->
	<aop:pointcut expression="execution(* cn.itcast.service.UserServiceImp.*(..))" id="pc"/>
	<!--配置切面  -->
	<aop:aspect>
	<aop:before method="before" pointcut-ref="pc"/>
	<aop:after-returning method="afterReturning" pointcut-ref="pc"/>
	<aop:after-throwing method="afterException" pointcut-ref="pc"/>
	<aop:around method="around" pointcut-ref="pc"/>
	<aop:after method="after" pointcut-ref="pc"/>
	</aop:aspect>
	
	</aop:config>
	
</beans>  

三.使用注解的方式 配置aop

package cn.itcast.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
// 表示这是一个通知类
public class MyAdive2 {
//	配置切入点
	@Pointcut("execution(* cn.itcast.service.UserServiceImp.*(..)) )")
	/*
	 * 前置通知 后置同志 环绕通知 异常拦截通知 后置通知(无论是否出现异常都会调用)
	 */
	// 前置通知
	@Before("MyAdvice.pc")
	public void before() {
		System.out.println("这个是前置通知");
	}

	// 后置通知
	@AfterReturning("execution(* cn.itcast.service.UserServiceImp.*(..)) )")
	public void afterReturning() {
		System.out.println("这个时后置通知,出现异常不会调用");
	}

	// 环绕通知
	@Around("execution(* cn.itcast.service.UserServiceImp.*(..)) )")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("这是环绕通知之前的部分");
		Object proceed = pjp.proceed();
		System.out.println("这是环绕通知后的部分");
		return proceed;
	}

	// 异常通知
	@AfterThrowing("execution(* cn.itcast.service.UserServiceImp.*(..)) )")
	public void afterException() {
		System.out.println("抛出异常了");
	}

	// 后置通知 出现异常也会执行
	@After("execution(* cn.itcast.service.UserServiceImp.*(..)) )")
	public void after() {
		System.out.println("这是后置通知,即使出现异常也会执行");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值