`
wb1991wb
  • 浏览: 157103 次
  • 来自: 上海
社区版块
存档分类
最新评论

【叨、校长】Spring Aop初探总结

阅读更多
本教程基于Spring官方文档、通俗易懂、老少皆宜!--叨、校长
【这个是使用Aspect标准的一个Spring Aop示例】
1、业务逻辑类:
package com.master.service;

public class UserService implements IUserService {
	//添加用户
	public void addUser(String name) {
		System.out.println("Add user...");
		System.out.println("=================");
	}
	
	//删除用户
	public void deleteUser(String name) {
		System.out.println("Delete user...");
		System.out.println("=================");
	}

}
 2、切面
package com.master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 定一个【切面】
 * @author Administrator
 */
public class LogAccessAspect {
	
	/**
	 * 定义一个切面通知、也就是该【切面】在【连接点】执行的方法--日志输出
	 * @param ponit 目标连接点对象--也就是【连接点】所在的对象
	 */
	public void outPutLog(JoinPoint point){
		//对象名称
		String methodName=point.getSignature().getName();
		System.out.println("【操作日志】-"+methodName);
	}
	
	/**
	 * 定义一个切面通知、也就是该【切面】在【连接点】执行的方法--权限控制
	 * @param ProceedingJoinPoint ppoint
	 * @return
	 * @throws Throwable
	 */
	public Object accessControl(ProceedingJoinPoint ppoint) throws Throwable{
		Object object=null;
		String user=(String) ppoint.getArgs()[0];
		String methodName=ppoint.getSignature().getName();
		if(user.equals("校长")&&methodName.equals("deleteUser")){
			System.out.println("你没有权限执行删除操作");
		}else{
			object=ppoint.proceed();
		}
		return object;
	}
}
 3、在spring容器中配置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"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
            
    <!-- 这是基于schema的AOP配置、很简单-->
	<aop:config>
		<!-- 定义【切面】 -->
		<aop:aspect id="LAAspect" ref="LogAccessAspectBean">
			<!-- 声明切面的【切入点】 -->
			<!-- 【切入点表达式】详情见【术语定义】 expression="execution(* com.master.service.*.*(..)) -->
			<aop:pointcut id="userService"  expression="execution(* com.master.service.*.*(..))" />
			<!-- 定义【通知】类型:【Before advice、After advice、After return advice、Around advice、After throwing advice】-->
			<aop:around pointcut-ref="userService" method="accessControl"/>
			<aop:after pointcut-ref="userService" method="outPutLog"/>
		</aop:aspect>
	</aop:config>
	<bean id="LogAccessAspectBean" class="com.master.aspect.LogAccessAspect"></bean>
	<bean id="UserServiceBean" class="com.master.service.UserService"></bean>
</beans>
 4、测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.master.service.IUserService;


public class TestAop {
	public static void main(String[] args) {
		ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
		
		//获取业务逻辑类对象
		IUserService service=(IUserService) ctx.getBean("UserServiceBean");
		service.addUser("校长");
		service.deleteUser("校长");
	}

}
 5、一些知识点的说明
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象 
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:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。 

环绕通知使用:ProceedingJoinPoint

切入点表达式:
expression="execution(* com.master.service.*.*(..))"
表示com.master.service包下,返回值为任意类型;方法名任意;参数不作限制的所有方法。

通知(Advice)类型 
前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。
后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。
返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在<aop:aspect>里面使用<after-returning>元素进行声明。
环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。
抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。 ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。

1
0
分享到:
评论

相关推荐

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring AOP完整例子

    总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    spring aop依赖jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    Spring AOP总结

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许开发者通过定义切面来实现代码的解耦和模块化。AOP的核心概念包括切面、通知、连接点、切入点、织入等,这些概念帮助我们实现横切关注点的分离...

    spring aop 五个依赖jar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...

    spring AOP依赖三个jar包

    Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行横切关注点的处理,如日志、事务管理等。实现这一功能,主要依赖于三个核心的jar包:aop...

    Spring aop 简单总结

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和解耦的编程方式,使得我们可以在不修改业务代码的情况下,实现对应用程序中的横切关注点(如日志、事务管理、权限控制等)的处理。...

    spring AOP 引入jar包,spring IOC 引入Jar包

    Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...

    spring AOP 理论知识点总结.wps

    spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。...利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护性。

    初探spring aop内部实现 java

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一的管理和控制。本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource...

Global site tag (gtag.js) - Google Analytics