在学习aop之前先来解释一下aop一些概念
- Joinpoint:它定义在哪里加入你的逻辑功能,对于Spring AOP,Jointpoint指的就是Method。
- Advice:特定的Jointpoint处运行的代码,对于Spring AOP 来讲,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。
- Pointcut:一组Joinpoint,就是说一个Advice可能在多个地方织入,
- Aspect:实际是Advice和Pointcut的组合,但是Spring AOP 中的Advisor也是这样一个东西,但是Spring中为什么叫Advisor而不叫做Aspect。
- Target:被通知的对象。
- Proxy:将通知应用到目标对象后创建的对象
- Weaving:将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。
spring对AOP的支持有以下4种情况:
- 经典的基于代理的aop(各版本spring)
- @AspectJ注解驱动的切面(spring2.0后)
- 纯pojo切面(spring2.0后)
- 注入式AspectJ切面(各版本spring)
ITarget.java
package com.myspring.aop;
public interface ITarget {
public void execute() throws TargetException;
}
TargetImpl.java
package com.myspring.aop;
public class TargetImpl implements ITarget {
public TargetImpl() {
}
public void execute() throws TargetException {
System.out.println("main...");
}
}
创建通知
Advice .java
package com.myspring.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
public class Advice implements MethodBeforeAdvice,
AfterReturningAdvice, ThrowsAdvice {
public Advice() {}
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("传统经典aop的before...");
}
public void afterReturning(Object rtn, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("传统经典aop的afterReturning...");
}
public void afterThrowing(Throwable throwable) {
System.out.println("传统经典aop的afterThrowing...");
}
public void afterThrowing(Method method, Object[] args, Object target,
Throwable throwable) {
System.out.println("传统经典aop的afterThrowing2...");
}
}
TargetException .java
package com.myspring.aop;
@SuppressWarnings("serial")
public class TargetException extends RuntimeException {
public TargetException() {}
public TargetException(String message) {
super(message);
}
}
使用自动代理@AspectJ切面时,需要先注册一个切面AspectAdvice.java
package com.myspring.aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect//声明切面
public class AspectAdvice {
@Pointcut("execution(* *.execute(..))")//定义切点,匹配规则为(返回类型 返回类.方法(参数设置)
public void todo(){}
@Before("todo()")
public void before() {
System.out.println("自动代理@AspectJ切面before...");
}
@AfterReturning("todo()")
public void afterReturning() {
System.out.println("自动代理@AspectJ切面afterReturning...");
}
@AfterThrowing("todo()")
public void afterThrowing() {
System.out.println("自动代理@AspectJ切面afterThrowing...");
}
}
AdviceBean.java
package com.myspring.aop;
public class AdviceBean {
public void before() {
System.out.println("纯POJO切面before...");
}
public void afterReturning() {
System.out.println("纯POJO切面afterReturning...");
}
public void afterThrowing() {
System.out.println("纯POJO切面afterThrowing...");
}
}
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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<!-- 当定义一个纯粹的POJO切面时,创建此Bean -->
<bean id="adviceBean" class="com.myspring.aop.AdviceBean"></bean>
<!-- 利用spring AOP的配置元素定义一个通知 -->
<aop:config>
<!-- 引用刚才定义的一个纯粹的POJO切面Bean -->
<aop:aspect ref="adviceBean">
<!-- 定义一个命名切点,必点切点定义的重复,expression用于配置匹配规则,(返回类型 返回类.方法(参数设置) -->
<aop:pointcut id="todo" expression="execution(* com.myspring.aop.TargetImpl.execute(..))" />
<!-- 方法前通知 -->
<aop:before method="before" pointcut-ref="todo" />
<aop:after-returning method="afterReturning" pointcut-ref="todo" />
<aop:after-throwing method="afterThrowing" pointcut-ref="todo"/>
</aop:aspect>
</aop:config>
<!-- ************************************** -->
<bean id="aspectAdvice" class="com.myspring.aop.AspectAdvice"></bean>
<!-- 当使用自动代理@AspectJ切面时,需要定义自动配置元素,在原来的xml文件的beans中加入xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd,具体位置如上 -->
<aop:aspectj-autoprox />
<!-- ************************************** -->
<!-- 以下为传统的aop代理 -->
<!-- 定义一个bean -->
<bean id="target" class="com.myspring.aop.TargetImpl">
</bean>
<!-- 定义一个通知bean -->
<bean id="advice" class="com.myspring.aop.Advice">
</bean>
<!-- 正则表达式切入点 -->
<bean id="jdkRegexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="advice" />
<property name="pattern" value=".*execute" />
</bean>
<!-- AspectJ切点 -->
<bean id="aspectjPointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="advice" ref="advice" /> <property name="expression"
value="execution(* *.execute(..))" /> </bean>
<!-- 使用ProxyFactoryBean工厂,用于生成一个代理,把一个或多个拦截者(和通知者)应用到Bean -->
<bean id="myAop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target" />
<property name="proxyInterfaces" value="com.myspring.aop.ITarget" />
<property name="interceptorNames" value="jdkRegexpAdvisor" />
</bean>
<!-- 创建自动代理,会自动检查通知者的切点是否匹配bean的方法,并且使用通知的代理来替换这个bean定义 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
</beans>
TestSpringAop.java
package com.myspring.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpringAop {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用经典的aop
ITarget target = (ITarget) ctx.getBean("myAop");
//使用自动代理,可以直接调用目标对象
ITarget autotarget = (ITarget) ctx.getBean("target");
target.execute();
}
}
分享到:
相关推荐
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...
### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...
总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...
### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...
Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕spring-aop.jar这个核心组件,详细探讨Spring AOP的原理、...
这些jar包是Spring AOP的基础,因为AOP功能是构建在Spring容器之上,依赖于Spring的其他组件来管理和实例化对象。 标签“spring AOP,jar”进一步强调了这个主题的重点,即关于Spring AOP的jar包配置。在实际项目中...
总结来说,"spring3.1 AOP依赖jar包"是Spring 3.1版本中实现面向切面编程所必需的库。aspectjrt.jar和aspectjweaver.jar提供了AspectJ的支持,实现了切面的定义和织入,而aopalliance.jar作为AOP框架间的通用接口,...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...
《Spring AOP 4.0.0.RELEASE:深度解析与应用》 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它为开发者提供了声明式事务管理、日志记录、权限控制等核心功能。在4.0.0....
这种轻量级的特性使得Spring AOP更易于学习和集成。 3. **灵活的通知模型**:Spring AOP提供了多种类型的通知,包括around、before、after returning、after throwing等,使得开发者可以根据实际需求选择最适合的...
总结,Spring AOP源码的探索有助于开发者深入理解面向切面编程的实现机制,提升问题解决能力,从而更好地利用AOP技术优化和维护应用程序。通过实践与学习,我们可以更好地驾驭这个强大的工具,提高代码的可维护性和...
总结来说,Spring AOP的注解引入通知通过`@DeclareParents`注解,为我们提供了一种优雅地向现有类添加新功能的方式,而无需改动原始代码。结合其他类型的注解通知,我们可以构建出灵活且高度模块化的系统。在实际...
总结来说,Spring AOP通过JDK的动态代理机制,为实现了接口的目标对象创建代理,使得我们能够在不修改原始代码的情况下,方便地添加额外的功能,如日志、事务控制等。这种方法尤其适合于那些已经定义了清晰接口的...
《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...
总结来说,Spring AOP是Spring框架的重要组成部分,它提供了一种优雅的方式去处理横切关注点,降低了代码的耦合度,提高了代码的可读性和可维护性。通过定义切面、切点和通知,我们可以轻松地实现常见的系统级服务,...
在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...
总结来说,模拟Spring的IoC和AOP主要是通过注解来管理和控制对象的生命周期及行为。虽然这种模拟简化了Spring的复杂性,但其核心思想是一致的:降低耦合,提高可维护性和可扩展性。理解并实践这些概念,对于掌握...
总结来说,Spring的AOP编程依赖于一系列核心和扩展包,包括Spring自身的核心和AOP模块,以及第三方的CGLIB和ASM库。理解这些组件的作用并正确配置它们,对于有效地利用Spring AOP实现代码解耦和模块化至关重要。