spring aop概念以及jdk的动态代理

AOP(Aspect-Oriented Programming),又称为面向切面编程。作为一种编程思想,AOP是 OOP(Object-Oriented Programing面向对象编程)一种 补充和完善。

AOP相关的术语

1.0 关注点 关注点就是所关注的与业务无关的公共服务或系统级服务,如日志记录,权限检查,事务管理等。关注点通常称为横切关注点,表示要做什么。

2.0 连接点 连接点就是程序执行过程中明确的阶段点,如方法的调用或异常的抛出等。其实,关注点的功能就是添加到相应的连接点。因此,连接点表示在那里做。在spring aop中,一个连接点总代表一个方法的执行。

3.0增强 增强就是在特定的连接点处所执行的处理逻辑,也就是面向连接点注入代码。增强通常有称为增强处理,表示具体做什么。

3.1.0 Before Advice 前置处理,在连接点执行前处理。

3.2.0 AfterReturning Advice后置增强,在连接点成功执行后调用。

3.3.0 AfterThrowing Advice,异常增强,在连接点抛出异常后被调用。

3.4.0 Around Advice 环境增强,在连接点执行前与执行后被调用。

4.0 切入点 切入点就是可以插入增强的连接点。

image.png

Jdk的动态代理 AOP是基于代理实现的,代理分为2大类,静态代理与动态代理。静态代理是在编译时候生成的,动态代理是在运行的时候生成的。

下面看一个jdk的动态代理的deom。 jdk动态代理需要一个接口,以及其实现类。

定义接口 UserService

package dflx;

public interface UserService {
    
    public void add();
    
    public void serach();
    
}

以及其实现类UserImpl,和jdk动态代理类MyJdkProxy

public class UserImpl implements UserService {

    @Override
    public void add() {
    System.out.println(" add user");
    }

    @Override
    public void serach() {
    System.out.println("search user");

    }

}



class MyJdkProxy implements InvocationHandler{
    
    private UserService user;
    
    public MyJdkProxy(UserService user)
    {
        this.user=user;
    }
    
    public UserService createJDKProxy(){
        
        return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(),
user.getClass().getInterfaces(),this);
        
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        if(method.getName().equals("add"))
        {
            System.out.println("记录日志");
            return method.invoke(user, args);
        }else {
            
            return method.invoke(user, args);
        }
    }

    
    
}

测试类 MyJdkTest 如下

package dflx;

import org.junit.Test;

public class MyJdkTest {
    
    @Test
    public void test() {
        //代理对象
        UserService user=new UserImpl();
        //创建代理
        MyJdkProxy myJdkProxy=new MyJdkProxy(user);
        
        UserService proxy=myJdkProxy.createJDKProxy();
        proxy.add();  //对add方法进行了增强
        proxy.serach();
        
    }

}

对add方法,进行了增强。 结果如下

记录日志
 add user
search user

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李家的小酒馆

AOP的具体实践-简化结果返回的处理

  以前学习Spring的时候着重学习过AOP概念,但是一直也没有用上,唯一碰到过的就是Spring内置的事务管理。现在碰到过一些结果后面的操作适合用到,所以这...

1192
来自专栏大内老A

.NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON、XML和INI,对应的配置源类型分别是JsonConfiguratio...

1925
来自专栏Coding迪斯尼

VUE+WebPack游戏设计:实现子弹发射击打外星人效果

1013
来自专栏林欣哲

Spring的AOP面向切面 知识点速查

通过实现BeanPostProcessor接口的postProcessBeforeInitialization和postProcessAfterInitiali...

672
来自专栏精讲JAVA

Spring AOP 的实现原理

AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点...

4777
来自专栏javathings

Spring 中 AOP 的实现

AOP 称为面向切面编程,在程序开发中,AOP 技术可以在不改变原有方法代码的情况下,把逻辑直接插入到方法上。Spring AOP 的大致原理主要依靠的是动态代...

1084
来自专栏coolblog.xyz技术专栏

Spring AOP 源码分析 - 筛选合适的通知器

从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP ...

1154
来自专栏一英里广度一英寸深度的学习

Spring 基础

interface声明接口,接口中的函数不用public/private,但是要匹配参数和异常。

961
来自专栏xingoo, 一个梦想做发明家的程序员

【Spring实战】—— 13 AspectJ注解切面

前面了解了典型的AOP基于配置的使用方法,下面介绍下如何依赖于注解来实现AOP。 基于注解降低了配置文件的复杂程度,但是引入了程序间的耦合,其中的优劣待用户...

2345
来自专栏Java帮帮-微信公众号-技术文章全总结

Spring-AOP

AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控/事务管...

3608

扫码关注云+社区

领取腾讯云代金券