Spring之AOP模块

AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特征

Spring推荐使用接口编程

Spring提供三种拦截器:方法前拦截器、返回后拦截器、异常抛出拦截器

拦截器定义

//Service接口
public interface IAopService{
	public void withAop() throws Exception;			//将会被拦截
	public void withoutAop() throws Exception;		//不会被拦截
}

public class AopServiceImpl implements IAopService{
	private String name;
	public void withAop() throws Exception{
		System.out.println("有AOP的函数运行。name:"+name);
		if(name.trim().length() == 0){
			throw new AccountException("name属性不能为空");
		}
	}

	public void withoutAop() throws Exception{
			System.out.println("没有AOP的函数运行。");
	}

	public void setName(String name){
		this.name = name;
	}

	public String getName(){
		return this.name;
	}
}
//方法前拦截器,检查name是否为空
import  org.springframework.aop.MethodBeforeAdvice;
public class MethodBeforeInterceptor implements MethodBeforeAdvice{
	//调用对象的方法前执行该方法
	//参数分别为被调用的方法、被调用方法的参数、对象
	public void before(Method method,Object [] args,Object instance) throws Throwable{
		System.out.println("即将执行方法:"+method.getName());
		//
		if(instance instanceof AopServiceImpl){
			String name = ((AopServiceImpl)instance).getName();
			if(name == null){
				throw new NullPointerException("name不能为空");
			}
		}
	}

}
//返回后拦截器
import  org.springframework.aop.AfterReturningAdvice;
public class MethodAfterInteceptor implements AfterReturningAdvice{
	//参数分别为方法返回值、被调用方法、方法参数、被拦截的对象
	public void afterReturning(Object value,Method method,Object [] args,Object instance) throws Throwable{
				System.out.println("方法:"+method.getName()+"执行完毕,返回值为:"+value);
	}

}
//异常拦截器捕获异常
import  org.springframework.aop.ThrowAdvice;
public class ThrowsInterceptor implements ThrowAdvice{
	//参数分别为被调用的方法、方法参数、对象实例、抛出的异常
	//前三个参数可以省略,第四个参数是必须的,这样设计是为了使开发者灵活地定义多个方法捕获各种不同的异常
	public void afterThrowing(Method method,Object [] args,Object instance,AccountException ex) throws Throwable {
		System.out.println("方法:"+method.getName()+"抛出了异常:"+ex);
	}

	public void afterThrowing(NullPointerException ex) throws Throwable {
		System.out.println("抛出了异常:"+ex);
	}

}

拦截器配置

Spring无法将Service的实现类与拦截器直接组装,因为没有对应的setter、getter方法。安装时借助的是Spring的代理类,把拦截器安装到NameMatchMethodPointcutAdvisor中,把自动以的Service安装到ProxyFactoryBean中,然后组装到一块

<!-- 方法前拦截器MethodBeforeInterceptor安装到NameMatchMethodPointcutAdvisor中 -->
<bean id="aopMethodBeforeInterceptor" class="org.springframework.aop.support. NameMatchMethodPointcutAdvisor">
	<!--  拦截器的实现类-->
	<property name="advice">
		<bean class="com.clf.spring. MethodBeforeInterceptor">
	</property>
	<!--  欲拦截的方法名-->
	<property name="mappedName" value="withAop"> 	</property>
</bean>

<!-- 类似的方式配置返回后前拦截器MethodAfterInteceptor -->
<bean id="aopMethodAfterInterceptor" class="org.springframework.aop.support. NameMatchMethodPointcutAdvisor">
	<property name="advice">
		<bean class="com.clf.spring. MethodAfterInteceptor">
	</property>
	<property name="mappedName" value="withAop"> 	</property>
</bean>

<!-- 类似的方式配置异常前拦截器MethodAfterInteceptor -->
<bean id="aopThrowsInterceptor" class="org.springframework.aop.support. NameMatchMethodPointcutAdvisor">
	<property name="advice">
		<bean class="com.clf.spring. ThrowsInterceptor">
	</property>
	<property name="mappedName" value="withoutAop"> 	</property>
</bean>

<!-- Service实现类,安装到ProxyFactoryBean -->
<bean id="aopService" class="org.springframework.aop.ProxyFactoryBean">
	<!-- 安装拦截器-->
	<property name="interceptorNames">
		<list>
			<value>aopMethodBeforeInterceptor</value>
			<value>aopMethodAfterInterceptor</value>
			<value>aopThrowsInterceptor</value>
		</list>
	</property>
	<!—被拦截的对象-->
	<property name="target">
		<bean class="com.clf.spring.AopServiceImpl">
			<property name="name" value="HelloSpring"></property>
		</bean>
	</property>
</bean>

AOP相关概念

切面Aspect

在本例中,方法withAop()、withoutAop()中都有一些代码,这些代码可以看做是AOP中的切面,可以将切面理解为模块

通知Advisor

本例的三个拦截器都是实现自某个接口,从类名上看就知道三个拦截器都是AOP中的通知。一旦Spring符合条件,就会派发出通知,即一些需要执行的代码,能实现某种功能

切入点Pointcut

在配置拦截器时,XML中只配置了withAop()方法使用拦截器,而withoutAop()方法没有配置拦截器,这种配置是借助于org.springframework.aop.support. NameMatchMethodPointcutAdvisor完成的。这就是一个切入点,配置时可以使用通配符。该类明上也带有Advisor是因为它也是用通知实现的

简单地说,切入点负责往什么地方插入代码,而通知负责插入什么代码

Spring提供灵活的切入点配置,例如使用正则表达式

<bean id="advisorTest" class="org.springframework.aop.support.RegexMethodPointcutAdvisor">
	<property name="interceptor">
		<ref local="someInterceptor">
	</property>
	<property name="pattern">
		<list>
			<value>.*get*</value>
			<value>.*set*</value>
		</list>
	</property>
</bean>
时间: 2024-10-28 11:46:15

Spring之AOP模块的相关文章

Spring 之 AOP

面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化.AOP 的核心构造是方面, 它将那些影响多个类的行为封装到可重用的模块中. 通常情况下,对于AOP,我们有两种方式来实现. 使用DynamicProxy实现AOP 下面是一个简单的示例,首先定义业务对象: 1 public interface UserDao { 2 3 void save(); 4 } 5 6 public class UserDaoImpl imp

spring的AOP个人理解和使用

1什么是AOP:AOP是面向切面编程,也就是说面向某个功能模块编程,典型的应用就是Spring的声明式事务, Spring的AOP事务解析: 在以前的事务管理是要融合在逻辑代码中的,在逻辑代码中决定事务是否提交或者回滚,这样很容易造成代码难以维护,代码冗余 但是使用spring的声明式事务后,只需要在数据库处理方法上注解事务,就可以对操作进行管理,事务的设置和逻辑代码分开,容易维护2AOP有什么作用 :面向切面编程,例如某个功能点,我们只需抽取横切关注点,然后让需要处理这些功能点的方法来使用代理

Spring的DAO模块

Spring的DAO模块提供了对JDBC.Hibernate.JDO等DAO层支持. DAO模块依赖 commons-pool.jar.commons-collections.jar package com.dao; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.support.

Spring的AOP详解

Spring的AOP详解 一.AOP基础 1.1AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢? 传统解决方案 1.日志部分定义公共类LogUtils,定义logPayBegin方法用于记录支付开始日志, logPayEnd用于记录支付结果 logPayBegin(long userId,long money) logPay

spring的AOP

最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spring的AOP还比较陌生,事后通过网上学习对其有了较好的了解. AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象

Spring中AOP原理,使用笔记

AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级服务. 系统级服务指的是:事务处理,日志记录,性能统计,安全控制,异常处理等,因为这些功能分散在程序的各个模块中,又是通用的,所以可以将它从业务逻辑中分离出来. 连接点(joinpoint):在连接点可以拦截方法的执行,在连接点前后织入上述的这些系统级服务(织入的就是通知). 切入点(pointcut)

跟着刚哥学习Spring框架--AOP(五)

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各

spring(4)面向切面的Spring(AOP)

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(4)面向切面的Spring(AOP)" 的相关知识: 2)在软件开发中,散布于应用中多处的功能被称为横切关注点.通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中).把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题:(干货--引入横切关注点及其所要解决的问题) 3)

Spring之Aop与Ioc

用Spring用了这么久,也该找个时间总结总结,这里我并没有把Aop和Ioc分开讲. 首先概述一下Spring,Spring是一款设计非常好的解耦框架,无侵入性,可以整合其它很多框架,比如常用的Struts,Hibernate,Mybatis或者Ibatis等,由此可以解决企业开发的复杂性,其核心的两个东西,就是AOP和IOC. Spring包含了7个模块,每个模块可以独立存在 每个模块的作用如下(这里参考的其它博客.原文地址:http://www.ibm.com/developerworks/