提示:这本文入门使用
前言
提示:以下是本篇文章正文内容,下面案例可供参考
SpringAOP的引入和配置使用
AOP: Aspect Oriented Programming面向切面编程 OOP: Object Oriented Programming面向对象编程 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,虽然IOC容器没有依赖AOP,但是AOP提供了非常强大的功能,用来对IOC做补充。通俗点说的话就是在程序运行期间,将某段代码动态切入到指定方法的指定位置进行运行的这种编程方式。
ASM是一个Java字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM可以直接产生二进制 class文件,也可以在类被加载入Java虚拟机之前动态改变类行为。Java class被存在储在严格格式定义的.class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及Java字节码(指令))。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。说白了asm是直接通过字节码来修改class文件。
//获取被代理对象的类加载器 ClassLoader loader = calculator. getClass().getClassLoader() ; //被代理对象的所有接口 Class<?>[] interfaces = calculator. getClass().getInterfaces() ; //用来执行被代理类需要执行的方法 InvocationHandler handler = new InvocationHandler() { public 0bject invoke(Object proxy,Method method,Object[] args) throws Throwable { //开始调用被代理类的方法 Object result = method.invoke(calculator,args); //(方法参数必须设置final,因为匿名内部类调用外部参数) //args参数列表 return result; } }; Proxy.newProxyInstance(1oader, interfaces, handler);
必需要有接口,如果没有接口,就不能使用,这种方式是用Jdk提供的reflect包下的类,但是在生产环境中我不能保证每个类都有实现的接口,所有有第二种方式cglib cglib在实现的时候有没有接口都无所谓 在spring中使用了两种动态代理的方式,一种是jdk提供的(刚刚完成的)另外一种就是cglib 实际切入代码的地方称之为切入点、切入点是连接点的部分子集,同时切入点可以进行实际的控制,可以通过表达式来做实际的限制
AOP的核心概念及术语
·切面(Aspect):指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。在Spring AOP中,切面可以使用通用类基于模式的方式(schema-based approach)或者在普通类中以@Aspect注解(@Aspect]注解方式)来实现。 ·连接点(Join point):在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。 ·通知(Advice):在切面的某个特定的连接点上执行的动作。通知有多种类型,包括"around", “before” and"after"等等。通知的类型将在后面的章节进行讨论。许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。 ·切点(Pointcut):匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心: Spring默认使用Aspect)切点语义。 ·引入 (Introduction):声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例如,可以使用引入来使bean实现工sModified接口,以便简化缓存机制(在Aspect社区,引入也被称为内部类型声明(inter) ) 。 ·目标对象(Target object):被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。 AOP代理(AOP proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。 ·织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用Aspect]编译器)、类加载时或运行时中完成。Spring和其他纯Java AOP框架一样,是在运行时完成织入的。
AOP的通知类型
前置通知(Before advice):在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。 后置返回通知(After returning advice):在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)。 后置异常通知(After throwing advice):在方法抛出异常退出时执行的通知。 后置通知(总会执行)(After (finally) advice):当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。 环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型,。环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。
添加依赖
编写配置
·将目标类和切面类加入到IOC容器中,在对应的类上添加组件注解 。 给LogUtil添加@Component注解 。给MyCalculator添加@Service注解。添加自动扫描的配置
<context:component-scan base-package=“com.path”></context:component-scan> 设置程序中的切面类 ——在LogUtil.java中添加@Aspect注解 ·设置切面类中的方法是什么时候在哪里执行
< !–开启包的扫描–> <context:component-scan base-package="com.mashibins"1 < !–开启aop的注解功能–> </aop: aspectj-autoproxy>
|