Spring笔记4-AOP

AOP简介:

  面向切面编程

首先介绍动态代理:

动态代理可以在类的所有方法之前增加业务逻辑。jdk中的类想要被动态代理,必须实现接口(假设Target实现了接口ITarget)。使用proxy与实现InvocationHandler接口,来实现动态代理(参视频:动态代理)。PHandler实现InvocationHandler接口,其中含有private的Object(被代理对象target)。在自己的invoke方法(参见反射)中先写入自己的代理前业务逻辑,再通过反射方法调用被代理对象的对应方法(即method.invoke(target,args)),最后加上代理后业务逻辑。如果针对不同的业务逻辑增加不同的业务,可以将method传入PHandler的beforeMethod()方法,进而判断不同的method写入不同的beforeMethod方法内容。

实现动态代理的过程为:先产生一个被代理对象target,产生一个PHandler,将target用setter传给PHandler。然后使用ITarget targetProxy = Proxy.newProxyInstance(),将target与handler传入,传入方法为arg0:target.getClass().getClassLoader(),arg1:target.getClass().getInterfaces(),arg2:PHandler。handler中含有我们想加入的业务逻辑,target为被代理对象,含有原来的业务逻辑。

最后执行targetProxy.业务逻辑(业务参数);执行时先执行handler的begin逻辑,再执行target,最后执行handler的end逻辑。

Spring中的AOP实现,背后使用的是动态代理的实现(对有实现的类),对没有实现接口的类直接更改二进制码。

AOP的实现:

Java中实现AOP,需要在Spring的.xml中增加xmlns=“http://.../aop”,xsi:schemalocation中加schema/aop,schema/aop/spring-aop-2.5.xsd(可以在spring的samples中寻找例程,或者dist/resources寻找aop的.xsd)(在IDE的XML Catalog中增加后一个.xsd可以获得IDE的提示功能)。在.xml正文中增加<aop:aspectj-autoproxy/>,即可使用@AspectJ标签(程序会扫描@AspectJ标签并进行动态代理)。

AspectJ:AspectJ是一个专门用于产生动态代理功能的项目。Spring也使用了AspectJ进行AOP实现。使用AJ时要引入AspectJ的两个.jar包。

AOP的使用:

在类名前添加@Aspect标签(表示此类可以作为切面进行织入),并加入@Component(将此类交给Spring初始化,用于织入工作)。在想要在原逻辑前织入的业务逻辑(如beforeMethod())(其实也有将类,属性织入的,暂不讨论)上方加@Before标签(或任何Advice),即实现了将beforeMethod()织入原对象逻辑。

@Before的语法:

@Before("execution(public 返回值类型 com.company.dao.impl.UserDAOImpl.函数名(com.company.model.函数参数类名)”):将被@Before形容的方法织入到execution形容的函数名执行之前。execution是方法织入的专用关键词。

JoinPoint:

切入点,即在原逻辑中的哪些点需要织入切面逻辑;也即在从前往后的业务逻辑中插入切面时,在原逻辑中被织入的位置。

PointCut:

切入点的集合。

@Pointcut("execution(* com.company.someapp.service.*.*(..))")

public void someMethod(){}

代表在com.company.someapp.service下的任何类的任何方法都是someMethod()的切入点。

someMethod可以是空实现,作为Advice的参数。在此之后可以在任何Advice的参数中写someMethod(),即可在此切入点集合中执行。

Advice:

代表在切面上的建议逻辑。如@Before,@After都是切入点上的建议。

Target:

被代理对象(被织入对象)。

Weave:

织入。

AOP支持的AspectJ语法:

execution(public * *(..)):公开的任何返回值的任何方法

execution(* set*(..)):任何返回值的任何方法名为set打头的方法

execution(* com.comp.service.*.*(..)):任何返回值的service包下的任何类的任何方法

execution(* com.comp.service..*.*(..)):任何返回值的service包下及其子包(无限层)的任何类的任何方法

AOP自成语法:

within(com.comp.service.*):

within(com.comp.service..*):

this(com.comp.service.SomeService):

target(com.comp.service.SomeService):

args(java.io.Serializable):

etc.

Advice类型:

@before("execution()")或者Before(someMethod)[参见上PointCut解释]:

@AfterReturning:于目标方法正常返回后执行。

@AfterThrowing:于目标方法抛出异常后执行。

@After:即finally,不论异常或正常返回均执行。

@Around:环绕。被环绕修饰的方法public Object doBasicProfiling(方法名可换),参数为ProcedingJoinPoint pjp(不可换),throws Throwable。

在此方法中先写before织入逻辑,再写Object retVal = pjp.proceed();,再写after织入逻辑,最后 return retVal;。(可参责任链模式的视频)

Advice的参数可以是execution,也可以是someMethod[参见PointCut解释]

时间: 2024-11-10 05:47:04

Spring笔记4-AOP的相关文章

Spring笔记(三)AOP前篇之动态代理

AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态代理,两者的区别是JDK动态代理的实现中业务类必须必须定义接口,而CGLIB没有这个约束,可以说CGLIB更强大: JDK动态代理实现示例: // 业务接口定义 public interface IUnit {     void execute(String msg); } // 业务实现类 pub

Spring笔记(三):Aop详解

一.Aop原理 (一)动态代理 1.详见:java进阶(七):详解JAVA代理 2.主要是Proxy 与 InvocationHandle r接口 (二)Cglib 实现 1.主要是 Enhancer 和 MethodInterceptor 接口 2.实现代码如下: <span style="font-size:18px;"> /** * 利用 cglib 实现 * @param targrt * @return */ public static Object getCgP

Spring 3.0 AOP (一)AOP 术语

关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方法调用的拦截.借此实现AOP.感兴趣的园友可以去瞅瞅. 今天.我们来看一下Spring中的AOP,本随笔着重关注AOP术语. 先说一句废话:如果你对AOP不是很熟悉.第一次看到这些术语可能会有点迷惑,不过没有关系.坚持继续向下看,然后再反过来看一遍,有些东西就能恍然大悟了. 连接点(Joinpoint) 连接

spring笔记(一)

这几日,在看spring框架的知识,了解了一下spring的IoC核心,AOP的概念,然后剩下的其实就是Spring对于其他的java服务的封装:ORM,web, JMS,JMX等. 坦白地说,我并没有完全理解spring的结构,首先它的API,我还不是很清楚,现在能至少做个分类.其次,spring框架和ORM之类的框架在做集成时的编程经验,我还没有. 后面的路要一分为二,继续对于spring底层的细节进行学习和了解,其次对于spring和其他组件整合的知识在实践中学习.看书估计不管用了. sp

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

Spring Boot学习——AOP编程的简单实现

首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式.AOP的思想理念就是将通用逻辑从业务逻辑中分离出来. 本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下: 第一步,添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

Spring 笔记

1, 新建包或导入工程错误提示: The type javax.servlet.ServletContext cannot be resolved. It is indirectly referenced from required .class files. 解决方法:在安装的tomcat下的lib目录里面找到servlet-api.jar包,导入项目下的lib文件夹中即可. 2,Could not load the Tomcat server configuration at /Server

Spring核心框架 - AOP的原理及源码解析

一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置AOP将基础和切面结合起来,从而完成切面对目标对象的编织实现. 层次2面向方面系统:配置模型,逻辑配置和AOP模型是为上策的语言和开发环境提供支持的,主要功能是将需要增强的目标对象.切面和配置使用AOP的API转换.抽象.封装成面向方面中的逻辑模型. 层次1底层编织实现模块:主要是将面向方面系统抽象封

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob