一、 AOP术语
切面(Aspect):需要实现的交叉功能
连接点(Join point):应用程序执行过程中插入切面的地点;此处可是方法的调用、异常的抛出甚至是修改的字段。
通知(Advice):通知切面的实际实现。它通知应用系统新的行为,通知在连接点插入到应用程序系统中。
切入点(point Cut):定义通知应该应用在哪些连接点。通常指定的类名和方法名,或匹配类名和方法名样式的正则表达式来制定切入点
引入(Introduction):允许为已存在类添加新方法和属性。
目标对象(Target):被通知的对象。既可是编写的类也可是添加定制行为的第三方类。
代理(Proxy):将通知应用到目标对象后创建的对象。
织入(weaving):将切面应用到目标对此那个从而创建一个心的代理对象的过程。切面是指接入点被织入到目标对象中,织入发生在目标对象生命周期的多个点上:
在指定接入点被织入到目标对象中,注入发生在目标对象生命周期的多个点上:
编译器:切面子啊目标对象编译时织入(需特殊的编译器)
类装载期:切面在目标对象被载入到jvm时织入(需要特殊的类载器,在类的载入到应用系统之前增强目标对象的字节码)
运行期:切面在用系统运行时织入(通常,AOP容器将在织入切面时动态)
二、 Sping中Aop的实现
(一) 创建通知
通知类型
|
接口
|
描述
|
Around
|
import org.aopalliance.intercept.MethodInterceptor;
|
拦截目标方法的前后调用
|
Before
|
import org.springframework.aop.MethodBeforeAdvice;
|
拦截目标方法前调用
|
After
|
import org.springframework.aop.AfterReturningAdvice;
|
拦截目标方法的之后调用
|
Throws
|
import org.springframework.aop.ThrowsAdvice;
|
目标抛出异常时调用
|
1. 前置通知
前置通知需要实现MethodBeforeAdvice接口
package com.csdn.util;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class StudentAdvice implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("开始学习....的前置通知!!");
}
}
注:Method 的一个参数是要实现通知的目标方法(连接点), arg1 为参数,arg2为目标对象。
目标对象
package com.csdn.service;
public class StudentServiceImpl implements StudentService {
@Override
public void study() {
System.out.println("调用学习的方法...");
}
@Override
public void paly() {
System.out.println("调用paly的方法....");
}
}
Student.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 前置通知 -->
<bean id="studentAdvice" class="com.csdn.util.StudentAdvice" />
<!-- 目标对象 -->
<bean id="studentServiceImpl" class="com.csdn.service.StudentServiceImpl"/>
<!-- 代理对象 基于接口编程 -->
<bean id="studentProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的接口 -->
<property name="proxyInterfaces">
<list>
<value>com.csdn.service.StudentService</value>
</list>
</property>
<!-- 拦截的名称 -->
<property name="interceptorNames">
<list>
<!-- 不能有空格和换行 如:<value> studentAdvice </value> -->
<value>studentAdvice</value>
</list>
</property>
<!-- 目标对象 -->
<property name="target" ref="studentServiceImpl">
</property>
</bean>
</beans>
注:测试接口时调用studentProxyFactoryBean如下
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
StudentService ss = (StudentService) ac
.getBean("studentProxyFactoryBean");
1. 后置通知
后置通知需要实现AfterReturningAdvice接口如下
package com.csdn.util;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class StudentAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnType, Method method, Object[] arg2,Object targeType) throws Throwable {
System.out.println("后置处理 ");
}
}
目标对象
package com.csdn.service;
public class StudentServiceImpl implements StudentService {
@Override
public void study() {
System.out.println("调用学习的方法...");
}
@Override
public void paly() {
System.out.println("调用paly的方法....");
}
}
3. 环绕通知
环绕通知实现MethodInterceptor接口:
实现的方法为
package com.csdn.util;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class StudentAround implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("前");
Object obj=invocation.proceed();//调用目标方法
System.out.println("后");
return obj;
}
}
与前面的两种区别
MethodInterceptor能控制方法是否真的被调用。通过调用MethodInvocation的Proceed()方法来调用目标方法。
Method能控制返回的对象。
4. 异常通知
异常通知需要是想的接口是ThrowsAdvice
package com.csdn.util;
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class StudentException implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args, Object target,
Exception ex) {
System.out.println("方法的名称:" + method + "方法的参数" + args.length + "目标对象:"
+ target.getClass().getName() + "异常" + ex.getMessage());
}
}
Xml中如下
<!-- 异常对象的获取 -->
<bean id="studentException" class="com.csdn.util.StudentException" />
<!-- 目标对象 -->
<bean id="studentServiceImpl" class="com.csdn.service.StudentServiceImpl"/>
<!-- 代理对象 基于接口编程 -->
<bean id="studentProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的接口 -->
<property name="proxyInterfaces">
<list>
<value>com.csdn.service.StudentService</value>
</list>
</property>
<!-- 拦截的名称 -->
<property name="interceptorNames">
<list>
<!-- 不能有空格和换行 如:<value> studentAdvice </value> -->
<value>studentException</value>
</list>
</property>
<!-- 目标对象 -->
<property name="target" ref="studentServiceImpl">
</property>
</bean>
Student.xml中如下
<!-- 后置通知 -->
<bean id="studentAfterAdvice"class="com.csdn.util.StudentAfterAdvice"/>
<!-- 目标对象 -->
<bean id="studentServiceImpl" class="com.csdn.service.StudentServiceImpl"/>
<!-- 代理对象 基于接口编程 -->
<bean id="studentProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的接口 -->
<property name="proxyInterfaces">
<list>
<value>com.csdn.service.StudentService</value>
</list>
</property>
<!-- 拦截的名称 -->
<property name="interceptorNames">
<list>
<!-- 不能有空格和换行 如:<value> studentAdvice </value> -->
<value>studentAfterAdvice</value>
</list>
</property>
<!-- 目标对象 -->
<property name="target" ref="studentServiceImpl">
</property>
</bean>
注:测试接口时调用studentProxyFactoryBean如下
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
StudentService ss = (StudentService) ac
.getBean("studentProxyFactoryBean");
分享到:
相关推荐
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架的重要组成部分,它提供了一种在不修改原有业务代码的基础上,插入额外功能的编程模型。Spring AOP使得开发者能够更方便地实现如日志记录、事务管理、...
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...
总的来说,面向切面编程AOP是一种强大的工具,用于管理横切关注点,它使我们能够编写更加模块化、可重用的代码,特别是在大型企业级应用中,如Web开发,它可以极大地提升代码质量和开发效率。通过合理使用AOP,我们...
面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...
Spring 面向切面编程AOP实现详解 面向切面编程(AOP)是一种编程技术,旨在将横切关注点从业务逻辑中分离出来,提高系统的可扩展性和可维护性。Spring 作为一个流行的 Java 框架,提供了完备的 AOP 实现机制。 1. ...
总的来说,面向切面编程AOP是一种强大的设计模式,它通过Spring框架的实现,使得在Java应用中实现关注点分离变得更加容易。正确地运用AOP,可以极大地提升代码的整洁性和可维护性,同时降低系统的复杂度。
2、面向切面编程AOP 在实现过程中,我尽量贴近实际开发与场景,麻雀虽小,五脏俱全,个人感觉这个项目是web框架搭建的一个极简之道实践。 项目中可能还存在很多的问题,希望大家不吝赐教,谢谢。
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下对应用程序的行为进行统一管理和控制。在本实例中,我们将深入探讨如何使用AspectJ技术和XML配置来实现AOP。 首先,了解...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...
面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在提高软件的模块化程度,通过将关注点分离到不同的“切面”中来实现。在.NET环境中,AOP通常通过拦截器(Interceptor)或动态代理...
AOP面向切面编程.ppt
spect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的...
### 面向切面编程(AOP) 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在提高模块化程度,通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,使得代码更加清晰、...
面向切面编程(AOP)是一种编程范式,它旨在减少代码中的重复部分,特别是那些与核心业务逻辑无关但又必须处理的交叉关注点,如日志、事务管理、安全控制等。Spring框架是Java领域中实现AOP的常用工具,它通过提供...
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在将系统中的关注点分离,使得代码更加模块化,易于维护和扩展。在传统的面向对象编程(OOP)中,业务逻辑往往与日志、事务管理、权限控制等横...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论...
面向切面编程(AOP)是一种编程范式,它旨在将关注点分离,使得系统中的核心业务逻辑与系统服务(如日志、事务管理、权限控制等)可以解耦。在Android开发中,AOP的应用可以帮助我们更好地组织代码,提高可维护性和...
在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP...