spring - AOP 基础(一)

spring AOP

spring支持四种拦截类型:目标方法调用前,目标方法调用后,目标方法调用前后,方法抛出异常。

spring Aop采用动态代理的方式生成代理类,前面分析过动态代理和静态代理以及区别,可以点击我的博客。

一些术语解释。

连接点:

程序的某个位置,就是程序也就是类里的方法,一个类可以有多个方法,多个连接点,就是在这些方法前后异常等做文章。

切点:

可能会和连接点混淆,类里有多个连接点,那么程序或者项目执行的时候如何找到对应的连接点?切点就是做这个工作的,

切点帮你定位到对应的连接点,然后执行那四种拦截,进行增强。

增强:

切点定位到具体的连接点,定位到了,我们需要对其做点什么,不能就定位到了那里就完事吧。增加就是对目标类的连接点也就是方法

执行一段逻辑。

目标对象:

被一个或者多个切面所通知的对象。

织入:

织入就是把增强类加入到目标类的里的具体连接点上,Aop有三种织入方式,编译器织入,装载器织入,动态代理织入。

切面:由增强和切点组成,横切关注点。

Spring 对AOP的支持,目前比较流行的两种方式,一是spring 本身支持AOP的方式,二是就是比较流行的框架Aspectj。

先来说说spring本身对AOP的支持。

异常通知拦截,为什么先说这个,因为这个ThrowsAdvice接口里面什么都没有,不像AfterAdvice,MethodBeforeAdvice,MethodInterceptor

这几种方式,有方法实现。

异常抛出通知:

package com.lw.rpc.test;

import java.lang.reflect.Method;

import net.sf.cglib.reflect.FastClass;

import net.sf.cglib.reflect.FastMethod;

import org.springframework.aop.ThrowsAdvice;

import org.springframework.aop.framework.ProxyFactory;

/**

* ThrowsAdvice 异常统计拦截

*

* @author

*

*/

public class SpringAopAdvice implements ThrowsAdvice {

/**

* 对未知异常的处理.

*/

public void afterThrowing(Method method, Object[] args, Object target, NumberFormatException ex) throws Throwable {

System.out.println("出现异常的类: " + target.getClass().getName());

System.out.println("出现异常的方法: " + method.getName());

System.out.println(" 具体什么异常 : " + ex.getClass().getName());

}

public static void main(String[] args) {

SpringAopBean bean = new SpringAopBean();

ProxyFactory pf = new ProxyFactory();

pf.setTarget(bean);

pf.addAdvice(new SpringAopAdvice());

SpringAopBean proxy = (SpringAopBean) pf.getProxy();

try {

// 测试

proxy.aopMethod1("spring");

} catch (Exception e) {

e.printStackTrace();

}

}

}

目标类:

package com.lw.rpc.test;

public class SpringAopBean {

public void aopMethod() throws NullPointerException {

System.out.println("空指针异常");

}

public int aopMethod1(String numStr) throws NumberFormatException {

int num = Integer.parseInt(numStr);

return num;

}

}

其他的几种方式,实现AfterAdvice,MethodBeforeAdvice,MethodInterceptor这三个接口就可以实现。

时间: 2024-10-07 23:11:29

spring - AOP 基础(一)的相关文章

CgLib动态代理学习【Spring AOP基础之一】

如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发现其参数类型是ClassLoader classLoader, Class<?>[] interface, InvocationHandler handler, 只支持根据接口实现代理类,如果所有代码都是自己掌控,当然没有问题.所有的业务逻辑均抽象出接口,然后所有的业务类实现接口,这样所有的业务类

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务

spring aop基础概念

spring aop基础概念 1.什么是aop: aspect oriented programming:面向切面编程. 即通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 主要功能是:日志记录,性能统计,安全控制,事务处理,异常处理等. 2.aop的实现方式: (1)预编译:AspectJ (2)运行期动态代理(JDK动态代理.CGLIB动态代理):SpringAOP.JbossAOP 3.aop的概念: (1)切面(aspect):一个关注点的模块化,这个关注点可能会横切多个

Spring AOP基础实践

一.代码实践 先上代码,Spring AOP的demo,见下面的小例子. 1 package demo.spring; 2 3 import org.aspectj.lang.annotation.After; 4 import org.aspectj.lang.annotation.Aspect; 5 import org.aspectj.lang.annotation.Before; 6 import org.aspectj.lang.annotation.Pointcut; 7 impor

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

Spring AOP基础知识

Spring AOP使用动态代理技术在运行期织入增强的代码,两种代理机制包括:一是基于JDK的动态代理,另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 1.带有横切逻辑的实例 ForumService:包含性能监视横切代码 package com.yyq.proxy; public interface ForumService { void removeTopic(int topicId); void removeForu

Java动态代理学习【Spring AOP基础之一】

Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.lang.reflect.Proxy 首先从代码层面说明Java动态代理是如何实现的, 业务逻辑接口: /** * 创建一个人的接口,其中有一个吃的方法 */ public interface Person { public void eat(); } 创建一个实现该业务接口的类: /** * 人接口的

Spring Aop基础总结

Aop是Spring的核心特性之一,是面向切面编程技术.实现方式是基于代领模式的,在程序流中找到切点,可以在切点前后执行一部分代码. 使用AOP,在UserDao的save方法前后,切入程序: UserDao package com.dao; public class UserDao { public void save(){ System.out.println("in save"); } } 切面程序,在save方法执行前后要执行的程序: package com.aop; impo