Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:
1 基于xml配置方式进行AOP开发
2 基于注解方式进行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:context="http://www.springframework.org/schema/context"
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.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy/><!-- 启动对@AspectJ注解的支持 -->
</beans>
//@Aspect 表示此类是一个切面,包含切入点和通知
//@Component 表示将此切面交由spring容器管理,此时必须在配置文件里面开启自动扫描
// 开启自动扫描 <context:component-scan base-package="cn.itcast"/>
@Aspect @Component
public class MyInterceptor {
//(1) 切入点的描述
/**
*@Pointcut :表示规定切入点
*execution() 语法规范
* 第一个“*”表示任意返回结果类型
* “cn.itcast.service.impl.PersonServiceBean”:表示对此类进行拦截,
* 如果是cn.itcast.service..*.*:表示对包cn.itcast.service以及子包里所
有的类的所有方法进行拦截,
* (..)表示参数
*/
@Pointcut("execution(*
cn.itcast.service.impl.PersonServiceBean.*(..))")
//(2)声明一个切入点
public void anyMethod(){}
//(3) 声明通知及注入方式
@Before("anyMethod()")
public void doAccessCheck(){
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrowing(){
System.out.println("异常通知");
}
@Around("anyMethod()") //环绕通知的方法签名是规定的!!!
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//if(){适合判断用户权限
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("退出方法");
//}
return result;
}
}
注册给容器后,如果执行此切面规定拦截的类的方法时,按照@Before等方式加上“通知”
得到的运行结果!!!!!一定注意顺序
前置通知
进入方法
我是save()方法
后置通知
最终通知
退出方法
―――――――――――
如果想在通知中得到拦截方法的参数,该怎么做?
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知");
}
注意:通知方法的参数名一定要和args指定的一致!!!
如果想得到拦截方法的返回结果,该怎么做?
@AfterReturning(pointcut="anyMethod()",returning="result")
public void doAfterReturning(String result){
System.out.println("后置通知:"+result);
}
如果想得到拦截方法抛出的异常,该怎么做?
@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println("异常通知:"+e);
}
基于xml配置方式进行AOP开发
<aop:config>
<aop:aspect id="asp" ref="myInterceptor">
<aop:pointcut id="mycut"
expression="execution(* cn.itcast.service..*.*(..))"/>
<aop:before pointcut-ref="mycut" method="doAccessCheck"/>
<aop:after pointcut-ref="mycut" method="doAfterReturning"/>
<aop:after-returning pointcut-ref="mycut" method="doAfter"/>
<aop:after-throwing
pointcut-ref="mycut" method="doAfterThrowing"/>
<aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
</aop:aspect>
</aop:config>
如果只是拦截返回值为String类型的方法,切面可以这样写
<aop:pointcut id="mycut" expression="execution(java.lang.String
cn.itcast.service..*.*(..))"/>
如果要求第一个参数为String类型,不管其后面有几个参数
<aop:pointcut id="mycut" expression="execution(*
cn.itcast.service..*.*(java.lang.String,..))"/>
如果要求返回值类型不为void,怎么写?
<aop:pointcut id="mycut" expression="execution(!void
cn.itcast.service..*.*(..))"/>
分享到:
相关推荐
Spring AOP允许开发者专注于核心业务逻辑,而把非业务相关的关注点,如日志、事务管理等,分离出来,从而提高开发效率和代码可维护性。 **AOP术语详解** 1. **Aspect**:切面是AOP的核心概念,它封装了特定的横切...
此外,需要在Spring的Bean配置文件中添加<aop:aspectj-autoproxy>元素以启用AspectJ注解的支持。 5. 声明AspectJ切面 要在Spring中声明AspectJ切面,需要在IOC容器中将切面声明为Bean实例。一旦在Spring IOC容器中...
这些知识点构建了Spring AOP的基础,通过这些,开发者可以灵活地实现横切关注点的解耦,提高代码的可维护性和复用性。在实际开发中,可以根据项目需求选择注解驱动或XML配置驱动的方式来实现AOP功能。
#### 关键知识点概述 1. **Spring-AspectJ集成:**本书重点介绍了Spring框架与AspectJ相结合的技术优势及其在企业级应用中的强大功能。 2. **面向切面编程(AOP):**深入探讨了AOP的概念、原理及其实现方式,特别是...
spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps
**Spring AOP 知识点:** 1. **概念理解**:AOP 是一种编程范式,它将关注点分离,让通用的横切关注点(如日志、事务管理)与业务逻辑解耦。在 Spring 中,切面可以通过注解或 XML 配置定义。 2. **通知类型**:...
下面将详细介绍Spring AOP的关键知识点以及与其相关的jar包。 1. **AOP概念**: - **切面(Aspect)**:AOP的核心概念,包含了横切关注点和通知(advice)。 - **横切关注点(Cross-cutting Concerns)**:应用中...
1. **XML配置**:在Spring的配置文件中,可以通过<aop:config>标签来定义切面,<aop:pointcut>定义切点,<aop:advisor>或<aop:aspect>定义通知。例如: ```xml <aop:config> <aop:pointcut id="myPointcut" ...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
在Spring AOP 4.3.10中,我们主要关注以下几个关键知识点: 1. **切面(Aspect)**:切面是AOP的核心概念,它封装了多个相关操作,包括通知(Advice)、引入(Introduction)、目标对象(Target Object)、织入...
下面我们将详细探讨这些知识点。 首先,Spring AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和代理(Proxy)。切面是封装一组相关或相互关联的横切关注点的模块化...
上述知识点覆盖了Spring AOP的基本概念、核心组件以及如何通过配置来创建和使用代理对象。通过这些知识的学习和应用,可以更好地实现业务逻辑与非业务逻辑代码的分离,提高代码的可维护性和可重用性。
1. **XML配置**:在`<aop:config>`标签中定义切面,`<aop:advisor>`定义通知,`<aop:pointcut>`定义切入点。 2. **注解驱动**:使用`@Aspect`注解声明切面类,`@Before`、`@After`、`@Around`、`@AfterReturning`、...
下面是关于 Spring AOP 使用教程的详细知识点。 什么是 AOP? AOP 是一种编程技术,它能够帮助开发者在软件系统中实现一些通用的功能,如日志记录、安全检查、事务管理等。AOP 的主要思想是将这些通用的功能从业务...
Spring AOP,全称为Spring...了解并熟练掌握这些知识点,能帮助开发者更好地利用Spring AOP来设计和实现高效、解耦的系统。在实际项目中,合理地使用AOP可以极大地提高代码的复用性和可维护性,同时降低系统的复杂度。
下面我们将深入探讨Spring AOP的底层实现技术和相关知识点。 1. **代理模式** Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来...
### Spring AOP 文档知识点详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个关键模块,它为开发者提供了在应用程序中实现横切关注点(Cross-cutting Concerns)的能力。横切关注点...
**Spring AOP基础知识** 1. **AOP概念**:AOP的核心是切面(Aspect),它封装了横切关注点,如日志、异常处理等。这些关注点通常分散在应用程序的多个类和方法中。AOP通过代理模式来实现,可以将切面逻辑织入到应用...
下面将详细阐述Spring AOP涉及的知识点及其相关jar包的作用。 首先,我们来看压缩包中包含的关键jar文件: 1. **aspectjweaver.jar**:这是AspectJ的织入器,负责在运行时动态地将切面代码插入到目标类中。AspectJ...
本项目实现了Spring AOP的基本概念和操作,以下是对相关知识点的详细说明: 一、AOP核心概念 1. 切面(Aspect):切面是关注点的模块化,它封装了横切关注点,如日志、事务管理等。 2. 连接点(Join Point):程序...