1、概念术语
在开始之前,需要理解Spring aop 的一些基本的概念术语(总结的个人理解,并非Spring官方定义):
切面(aspect):用来切插业务方法的类。
连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。
通知(advice):在切面类中,声明对业务方法做额外处理的方法。
切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。
目标对象(target object):被代理对象。
AOP代理(aop proxy):代理对象。
通知:
前置通知(before advice):在切入点之前执行。
后置通知(after returning advice):在切入点执行完成后,执行通知。
环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。
异常通知(after throwing advice):在切入点抛出异常后,执行通知。
Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术
2、AOP接口实现方式
利用Spring AOP接口实现AOP,主要是为了指定自定义通知来供spring AOP机制识别。主要接口:前置通知 MethodBeforeAdvice ,后置通知:AfterReturningAdvice,环绕通知:MethodInterceptor,异常通知:ThrowsAdvice 。
a、业务接口
package org.lazyzhong.dao; public interface BossSpeak { public void speak(); }
b、业务实现类
package org.lazyzhong.daoimpl; import org.lazyzhong.dao.BossSpeak; public class BossSpeakImpl implements BossSpeak{ @Override public void speak() { System.out.println("老板——————大家工作辛苦啦。。。我决定给大家发奖金1毛。。。"); } }
c、前置通知
package org.lazyzhong.util; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class BeforeInter implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { System.out.println("今天是个好日子啊。。。看到上个月的销售额,老板感到很开心。。。于是召集大家开会。。。"); } }
d、后置通知
package org.lazyzhong.util; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; public class AfterInter implements AfterReturningAdvice{ @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("会议结束。。。大家各回各的位置继续工作。。。"); } }
e、环绕通知
package org.lazyzhong.util; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class AroundInter implements MethodInterceptor{ @Override public Object invoke(MethodInvocation arg0) throws Throwable { //speak()方法开始。。。进入环绕方法 System.out.println("老板要开始讲话了。。。各位员工找个位置坐好。。。"); arg0.proceed(); //speak()方法结束。。。进入环绕方法 System.out.println("听到这个消息。。各位员工感到灰常开心。。。于是。。啪啪啪的声音响起。。"); return null; } }
f、切点
package org.lazyzhong.util; import java.lang.reflect.Method; import org.springframework.aop.support.NameMatchMethodPointcut; public class Pointcut extends NameMatchMethodPointcut { @Override public boolean matches(Method arg0, Class arg1) { //配置单个方法 this.setMappedName("speak"); // 配置多个方法 // String[] methods = { "xxx", "yyy" }; // this.setMappedNames(methods); return super.matches(arg0, arg1); } }
g、配置
<bean id="beforeAdvice" class="org.lazyzhong.util.BeforeInter" /> <bean id="afterAdvice" class="org.lazyzhong.util.AfterInter" /> <bean id="aroundAdvice" class="org.lazyzhong.util.AroundInter" /> <bean id="bossSpeak" class="org.lazyzhong.daoimpl.BossSpeakImpl" /> <bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut"> <property name="mappedNames"> <list> <value>speak</value> </list> </property> </bean> <!-- 指定切点匹配类 --> <bean id="pointcut" class="org.lazyzhong.util.Pointcut" /> <bean id="matchBeforeAdvice" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut"> <ref bean="pointcut" /> <!-- 也可以替换成pointcutBean --> </property> <property name="advice"> <ref bean="beforeAdvice" /> </property> </bean> <bean id="bossProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>org.lazyzhong.dao.BossSpeak</value> </property> <property name="target"> <ref bean="bossSpeak"/> </property> <property name="interceptorNames"> <list> <value>matchBeforeAdvice</value> <value>afterAdvice</value> <value>aroundAdvice</value> </list> </property> </bean>
h、测试类
package org.lazyzhong.test; import org.lazyzhong.dao.BossSpeak; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest1 { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); BossSpeak boss=(BossSpeak)context.getBean("bossProxy"); boss.speak(); } }
i、输出:
今天是个好日子啊。。。看到上个月的销售额,老板感到很开心。。。于是召集大家开会。。。 老板要开始讲话了。。。各位员工找个位置坐好。。。 老板——————大家工作辛苦啦。。。我决定给大家发奖金1毛。。。 听到这个消息。。各位员工感到灰常开心。。。于是。。啪啪啪的声音响起。。 会议结束。。。大家各回各的位置继续工作。。。
3、方式二——schema方式
a、业务类
package org.lazyzhong.dao; public class EmployeeSpeak { public void speak(){ System.out.println("员工——老板真抠门"); } }
b、切面类:切面类中包含所有通知
package org.lazyzhong.util; import org.aspectj.lang.JoinPoint; public class AspectAdvice { public void doBefore(JoinPoint jp) { System.out.println("员工们有话要讲。。。。"); } public void doAfter(JoinPoint jp) { System.out.println("员工们被炒鱿鱼了。。。"); } }
c、配置
<bean id="employee" class="org.lazyzhong.dao.EmployeeSpeak" /> <!-- 声明通知类 --> <bean id="aspectAdvice" class="org.lazyzhong.util.AspectAdvice" /> <aop:config> <aop:aspect id="TestAspect" ref="aspectAdvice"> <aop:pointcut id="point_cut" expression="execution(* org.lazyzhong.dao.*.*(..))" /> <aop:before pointcut-ref="point_cut" method="doBefore"/> <aop:after pointcut-ref="point_cut" method="doAfter"/> </aop:aspect> </aop:config>
d、测试类
package org.lazyzhong.test; import org.lazyzhong.dao.EmployeeSpeak; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest2 { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); EmployeeSpeak employee=(EmployeeSpeak)context.getBean("employee"); employee.speak(); } }
e、输出
员工们有话要讲。。。。 员工——老板真抠门 员工们被炒鱿鱼了。。。
切入点表达式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
modifiers-pattern:方法的操作权限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:参数名
throws-pattern:异常
其中,除ret-type-pattern和name-pattern之外,其他都是可选的。
Spring中的切入点分为两类:静态和动态。因为静态切入点的性能要优于动态切入点,所以优先考虑使用。Spring 为我们提供创建静态切入点很实用的类NameMatchMethodPointcut。在这个类中,我们只需要关心setMappedName和 setMappedNames方法。你可以使用具体的类名,也可以使用通配符。如:设置mappedName属性为set* 则匹配所有的set方法。Spring还提供了另通过正则表达式来创建静态切入点的实用类RegexpMethodPointcut。通过使用Perl样 式的正则表达式来定义你感兴趣的方法。当切入点需要运行时参数值来执行通知时,这时就需要使用动态切入点。静态切入点只限定于给定的方法和目标类,而不考虑方法的参数。
相关推荐
**Spring AOP 知识详解** 在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在...
"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...
《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...
Spring注解驱动开发第33讲——AOP原理总结
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
《深入解析Spring AOP框架——以spring-aop.jar为例》 Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
Spring容器简介——AOP AOP核心概念 Spring AOP的使用 Spring AOP常见用法 示例代码
总的来说,Spring 框架的这些核心组件——AOP、Beans、Context 和 MVC,通过 XML 配置文件实现了高度的灵活性和可扩展性,是现代企业级 Java 应用程序开发的基石。理解并熟练使用这些配置文件,是成为 Spring 开发者...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
4. **代理(Proxy)**:Spring提供了两种类型的代理——JDK动态代理和CGLIB代理。前者适用于接口实现类,后者用于没有接口或需要代理的目标类。Spring会自动选择合适的代理方式,但也可以通过配置强制使用某一种。 ...
本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...
《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...
jar包分享系列——spring-aop-4.3.3.RELEASE-sources.jar——下载。请放心下载。
标题“spring-aop”指的是Spring框架中的一个关键模块——面向切面编程(AOP)。Spring AOP是Spring框架的一部分,它允许开发人员实现横切关注点,如日志、事务管理、性能监控等,这些关注点通常在多个业务逻辑点交叉...
Spring2.5-Reference_zh_CN.chm Spring2.5-中文参考手册.chm spring——AOP,IOC.doc Spring框架快速入门之简介.doc spring配置全书.doc Spring中的IOC与AOP详解.ppt
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
标题中的“spring——第十四节素材.rar”表明这是一个关于Spring框架的教程材料,可能是课程的第14节内容。Spring是Java开发中最广泛使用的轻量级框架,它提供了丰富的功能来简化企业级应用的开发,包括依赖注入、...