SpringAOP总结

AOP是Aspcet Oriented Programming,实质意思就是将一些横切逻辑结成模块然后插入到业务逻辑的周围,而不侵入业务逻辑的代码当中,现在我们来看看aop的一些术语:

(1)连接点(JoinPoint):Spring只支持方法连接点,在spring中,方法都可以作为连接点

(2)切点(Pointcut):具体执行业务逻辑的业务方法所在处,可以通过切点函数得到具体的切点

(3)增强(Advice):织入到目标类连接点上的一段代码,并且拥有方位信息(方位指的是在切点的前面还是后面的意思)

(4)目标对象(target):增强织入的目标对象

(5)引介(introduction):为类增加一些接口和属性

(6)织入(weaving):spring采用动态代理,在运行期织入增强

(7)代理(Proxy):融合了原类和增强产生的结果类

(8):切面(Aspect):切面由切点和增强组成,Spring就是实现将增强添加到切点所在的位置

之前说道beanPostProcessor对于实现aop起到了重要作用,这里我们可以看到,这是因为这个processor提供了一些可以自动代理创建器,帮助增强织入到目标对象中产生代理对象

好了,现在我们继续来看下,spring有4种定义切面的方式:

一.基于Advisor类的方式:增强必须实现对应的接口,内部使用一个proxyFactory来产生代理对象(由于使用的较少,所以在这里不给demo)

二.基于注解:

@Aspect
public class TestAspect {
	@Before("execution(* say(..))")
	public void say(){
		System.out.println("hi");
	}
}
<aop:aspectj-autoproxy/>
	<bean id="carTarget" class="com.yue.test.PrivateCar"/>
	<bean id="testAspect" class="com.yue.aspectj.TestAspect"/>
String path = "bao.xml";
		ApplicationContext ac = new ClassPathXmlApplicationContext(path);
		PrivateCar pc = (PrivateCar) ac.getBean("carTarget");
		pc.say();

因为在这里当你通过getBean得到的已经是代理对象,所以在使用say方法的时候,实质上是调用了代理对象的这个方法。

下面来看看切点函数:

下面来介绍三个常用的切点函数:execution(),within(),target()

(1):execution(* *To(..))

第一个*代表任意返回值的方法,第一个*到括号之前代表方法的名字,*号代表任意数目的字符,这里是一切以to为后缀的方法,..表示任意多个参数

(2)within(com.baobaotao.*)匹配baobaotao这个包中所有类中的所有方法(不包括子类)

within(com.baobaotao..*)匹配所有类所有方法包括子类

(3)target(com.baobaotao.waiter)所有这个类和其子类的所有方法都匹配

然后再继续看看切点函数的复合运算:

&&:表示要取两个范围的交集

||:表示要取两个范围的并集

!:表示要取两个范围的非集

命名切点:使切点可以重用

不过这里有一个bug,照理说当方法修饰符是public的时候其他包中的切面应该也是可以引用这个切点的,然而在实验中会出现error bind type的错误,这令人十分不解,望高手指教

demo:

@Before("Gg.talk()")
	public void say(){
		System.out.println("hi");
	}
public class Gg {
	/*
	 * 必须注意的是方法修饰符限定了这个切点的使用范围
	 */
	@Pointcut("execution(* say(..))")
	public void talk(){
	}

}

还有特殊一点的环绕增强,可以用过一个proceedingJoinPoint对象访问连接点的信息

@Aspect
public class TestAspect {
	/*
	 * 值得注意的是在环绕增强中,必须显示的调用pjp.proceed()方法调用业务逻辑
	 */
	@Around("Gg.talk()")
	public void say(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("fdaf");
		pjp.proceed();
		System.out.println("what a spring!");
	}
}

三.基于schema定义切面(这也是我觉得最有美感的一种)

直接上demo:

<aop:config proxy-target-class="true">
		<aop:pointcut expression="execution(* *say(..))" id="point"/>

		<aop:aspect ref="greetingAdvice">
			<aop:before pointcut-ref="point" method="says"/>
		</aop:aspect>
	</aop:config>

	<bean id="greetingAdvice" class="com.yue.test.GreetingBeforeAdvice" />
	<bean id="carTarget" class="com.yue.test.PrivateCar"/>
	

<aop:config>表示在这里面定义的切面会自动织入目标对象产生代理对象,proxy-target-class表示使用jdk代理还是cglib代理

<aop:aspect>表示定义一个切面,ref表示这个切面引用的增强bean对象,里面的method表示织入这个增强bean中的哪个方法

<aop:pointcut>表示定义一个切点,切面可以使用pointcut-ref引用这个切点

注意的是当时环绕增强的时候,对应的方法要改为:

	public void says(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("ggg");
		pjp.proceed();
时间: 2025-01-16 14:41:11

SpringAOP总结的相关文章

spring-AOP之通知和顾问

通知和顾问都是切面的实现形式,其中通知可以完成对目标对象方法简单的织入功能. 而顾问包装了通知,可以让我们对通知实现更加精细化的管理,让我们可以指定具体的切入点. 通知分为前置通知,环绕通知及后置通知. 前置通知:在目标方法执行之前执行,不改变方法的执行流程及执行结果,前置通知的实现类要实现"MethodBeforeAdvice"这个接口. 环绕通知:也叫方法拦截器,可以改变方法的执行流程及执行结果,环绕通知的实现类要实现"MethodInterceptor"这个接

Spring-AOP实践

Spring-AOP实践 公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段的用时,其中计时器工具为StopWatch. 文章结构: 遇到的问题 创建项目 AOP-HelloWorld 时间统计 bug final 压力测试 源码 其中,遇到的问题: 1.少包aspectjweaver 添加依赖后才可以使用@Aspect 2.环绕通知加入多个point 刚开使用&&连

Spring声明式事务配置的两种策略SpringAop和Bean后处理器的代理BeanNameAutoProxyCreator

Spring的事务配置有两种:1编程式事务管理配置:2声明式事务管理配置.下面介绍两种声明式事务的配置,声明式事务相比于编程式事务代码耦合更低,无序书写任何事务管理的先关代码.两种声明式事务配置策略分别是:SpringAop事务管理和Bean后处理器的代理BeanNameAutoProxyCreator管理事务. 1.SpringAop事务管理配置 1.1.配置数据源: <bean id="pycDataSource" class="com.mchange.v2.c3p

AOP技术应用和研究--SpringAop实现原理

Spring 的AOP实现遵守了AOP联盟的约定.同时 Spring 又扩展了它,增加了如 Pointcut.Advisor 等一些接口使得更加灵活.在Spring的AOP模块中,包括AOP的基本概念,通知,切入点等,以及最核心的AopProxy代理对象生成和Spring AOP拦截器调用的实现. 1,Spring Aop的基本概念 我们在前面 AOP基本概念对AOP基本概念进行了理论上的定义,现在我们将Spring AOP基本概念作为例子来说明AOP的基本概念,这样可以更好的理解AOP基本概念

Spring-AOP用法总结

前言     Spring AOP的实现方法很多,在项目开发中具体采用什么方式,需要按实际情况来选择,每一种的用法,有其一定的实用价值,所以本文将各种使用方法进行了具体实现.主要包括Advice的before.after.throwing.around四种拦截方式的实现,如何进行正则匹配,自动化代理及AspectJ注解形式的实现. AOP的定义 Spring AOP(Aspect-oriented programming) 面向切面编程,是一种特殊的拦截器,将一组程序中的公共部分抽离出来进行单独

SpringAOP简介

AOP(Aspect Orient Programming) --- 面向切面编程 将分散在各个业务逻辑中的相同代码 通过 "横向"切割方式抽取到独立模块中 方式抽取到独立模块中;[它针对的是程序运行中的各个步骤] 优点:增强代码复用性,使编程人员专注业务于逻辑的实现: Spring AOP简介: Spring AOP是基于动态代理的 Spring AOP既支持JDK动态代理,也支持CGLib动态代理 l  如果目标对象实现了接口,默认釆用JDK动态代理 l  当然可以强制使用CGLi

springAop 使用@Around,@After等注解时,代码运行两边的问题

springAop使用@Around,@After等注解时,代码运行两边的问题 将@Component注解删掉就好了

SpringAOP与Redis搭建缓存

SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做查询部分: 数据查询时每次都需要从数据库查询数据,数据库压力很大,查询速度慢,因此设置缓存层,查询数据时先从redis中查询,如果查询不到,则到数据库中查询,然后将数据库中查询的数据放到redis中一份,下次查询时就能直接从redis中查到,不需要查询数据库了. redis作为缓存的优势: 1.内存

Spring-aop实现切面的四种方式(1)

Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一 个"时机",这些"时机"就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的"故事"和时间,那么切入点就定义了"故事"发生的地点,例如某个类或方法的名称,spri

spring-aop学习

 SpringAOP学习 author:luojie 1.  AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来定义自己的专用名词,可能会更加教人糊涂. 方面(Aspect):对横向分布在多个对象中的关注点所做的模块化.在企业应用中,事务管理就是一个典型的横切关注点.Spring java将方面实现为Advisor或拦截器(interceptor).(按:Advisor是通知和切入点的组合,拦截器实际就是指通