精华内容
下载资源
问答
  • Spring-AOP

    千次阅读 2019-12-28 03:16:44
    什么是AOP aop指的是面向切面编程,aop采取横向抽取机制取代了传统的纵向继承重复性代码 aop使用纯java语言实现,不需要专门的编译过程和类加载器 aop的术语(术语解释直接套用某位大神的文章) aop术语原网址 ...

    什么是AOP

    • aop指的是面向切面编程,aop采取横向抽取机制取代了传统的纵向继承重复性代码
    • aop使用纯java语言实现,不需要专门的编译过程和类加载器

    AOP的作用

    • Aop一般用来处理权限控制,日志记录,加载事务等非主要业务逻辑的事情。底层是采用cglib和jdk的动态代理实现的。

    aop的术语(术语解释直接套用某位大神的文章)

    aop术语原网址

    1. AOP术语

    连接点( Joinpoint ):可以被增强的方法都可以成为连接点

    程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。-个类或-段程序代码拥有一 些具有边界性质的特定点 ,这些点中的特定点就称为"连接点”。Spring仅支持方法的连接点 ,即仅能在 方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。连接点由两个信息确定:第是用方法表示的程序执行点;第二是用相对点表示的方位。

    切点( Pointcut ):真正被拦截到的点

    每个程序类都拥有多个连接点,如一-个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“ 切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一-对一的 关系,一个切点可以匹配多个连接点。在Spring中 ,切点通过org.springframework. aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件, Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切 地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

    增强( Advice ):拦截后要做的事情,对方法增加权限的校验等

    增强是织入到目标类连接点上的一段程序代码,在Spring中,增强除用于描述-段程序代码外, 还拥有另- -个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。

    目标对象(Target):要被增强的对象

    增强逻辑的织入目标类。如果没有AOP ,目标业务类需要自己实现所有逻辑,而在AOP的帮助下,目标业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。

    引介(Introduction)

    引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某 个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

    织入(Weaving):指advice应用到target的过程

    织入是将增强添加对目标类具体连接点上的过程。AOP像-台织布机,将目标类.增强或引介通过AOP这台织布机天衣无缝地编织到-起。根据不同的实现技术, AOP有三种织入的方式:
    a.编译期织入,这要求使用特殊的Java编译器。
    b.类装载期织入,这要求使用特殊的类装载器。
    C.动态代理织入,在运行期为目标类添加增强生成子类的方式。
    Spring采用动态代理织入,而Aspect]采用编译期织入和关装载期织入。

    代理(Proxy)

    一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。

    切面(Aspect)

    切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

    两种动态代理JDK动态代理和CGLIB动态代理

    jdk动态代理(有接口的情况下)

    创建一个接口UserDao,再创建一个类实现这个接口
    穿件一个

    接下来我们创建一个类使用JDK动态代理

    1. 继承InvocationHandler接口public class JdkProxy implements InvocationHandler
    2. 创建一个对象 private UserDao userDao;
    3. 使用构造方法初始化对象public JdkProxy(UserDao userDao){ this.userDao=userDao; }
    public Object createProxy(){
            Object proxy= Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);
            return proxy;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if("name".equals(method.getName())){
                System.out.println("权限校验...");
                return method.invoke(userDao,args);
            }
            return method.invoke(userDao,args);
        }
    

    测试

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191228030844338.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTQ2Nw==,size_16,color_FFFFFF,t_70

    CGLIB代理(无接口的情况下)

    1、创建一个类

    public class StudentDao{
    
        public void save(){
            System.out.println("保存商品...");
        }
    
        public void delete(){
            System.out.println("删除商品...");
        }
    
    }
    

    2、创建一个类继承MethodInterceptor接口

    public class MyCglibProxy implements MethodInterceptor {
    
        private StudentDao studentDao;
        public MyCglibProxy(StudentDao studentDao){
            this.productDao=productDao;
        }
    
        public Object createProxy(){
            //创建核心类
            Enhancer enhancer=new Enhancer();
            //设置父类(目标类)
            enhancer.setSuperclass(studentDao.getClass());
            //设置回调
            enhancer.setCallback(this);
            //生成代理
            Object proxy=enhancer.create();
            return  proxy;
        }
    
        @Override
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
           if("save".equals(method.getName())){
               System.out.println("权限校验==========");
                return methodProxy.invokeSuper(proxy,args);
           }
           /*引入invokeSuper表示调用父类的方法:相当于调用productDao中的方法*/
           return methodProxy.invokeSuper(proxy,args);
        }
    }
    

    3、测试

     @Test
        public void demo1(){
            StudentDao studentDao=new StudentDao ();
    
            StudentDao proxy=(StudentDao)new MyCglibProxy(studentDao).createProxy();
            proxy.save();
            proxy.delete();
            
        }
    

    以上便是AOP的描述,已经生成代理的方式,讲的不都清楚的,或者将错的,欢迎在评论区评论

    展开全文
  • Spring-AOP 自动创建代理

    千次阅读 2017-08-21 12:46:01
    导读 概述 实现类介绍 BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator ...AOP总结导读Spring-AOP 自动创建代理Spring-AOP 自动创建代理之BeanNameAutoProxyCreatorSpring-AOP 自动创建代理之DefaultAdv

    导读

    Spring-AOP 自动创建代理

    Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

    Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator

    Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


    概述

    我们通过前面几篇博文的案例,我们会发现都是通过ProxyFactoryBean创建织入切面的代理,每个需要被代理的Bean都需要使用一个ProxyFactoryBean进行配置。

    幸好Spring提供了自动代理机制,让容器自动生成代理,把开发人员从繁琐的配置中解脱出来。在内部,Spring使用BeanPostProcessor自动完成这项工作


    实现类介绍

    基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理内容。

    这些代理创建器可以分为3类

    • 基于Bean配置名规则的自动代理创建器
      允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator

    • 基于Advisor匹配机制的自动代理创建器
      它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator

    • 基于Bean中的AspectJ注解标签的自动代理创建器
      为包含AspectJ注解的Bean自动创建代理实例,实现类为AnnotationAwareAspectJAutoProxyCreator.

    自动创建代理器实现类的继承图

    这里写图片描述

    可以清楚的看到所有的自动代理器类都实现了BeanPostPorcessor,在容器实例化Bean时,BeanPostProcessor将对它进行加工处理,所以自动代理创建器有机会对满足匹配规则的bean自动创建代理对象


    BeanNameAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator


    DefaultAdvisorAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator


    AnnotationAwareAspectJAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


    AOP总结

    AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,将可以重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码问题。

    Spring采用JDK动态代理和CGLib动态代理技术在运行期织入增强,所以不需要装备特殊的编译器或类装载器就可以使用AOP功能。

    要使用JDK动态代理,目标类必须实现接口,而CGLib不对目标类作任何限制,它通过动态生成目标类子类的方式提供代理。

    在JDK动态代理中通过接口来实现方法拦截,所以必须确保要拦截的目标在接口中有定义,否则将无法拦截

    在CGLib动态代理中通过动态生成代理子类来实现方法拦截,所以必须确保要拦截的目标方法可以被子类访问,也就是目标方法必须定义为非final,且非私有实例方法。

    JDK在创建代理对象时的性能高于CGLib,而生成的代理对象的运行性能却比CGLib低。 如果是singleton的代理,推荐使用CGlib动态代理。

    Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置增强、后置增强、环绕增强、异常抛出增强,此外还有一种特殊的引介增强。 引介增强是类级别的,它为目标类织入新的接口实现。 从广义上将,增强其实是一种最简单的切面,它既包括横切代码又包括切点信息,只不过它的切点只是简单的方法相对位置信息。 所以增强一般需要和切点联合才可以表示一个更具实用性的切面。

    在Spring中,普通的切点通过目标类名和方法名描述连接点的信息。 流程切点是比较特殊的切点,它通过方法调用堆栈的运行环境来决定连接点。 有时候需要通过切点的交叉或者合并描述一个最终的切点,可以使用ComposablePointcut的复合切点

    切面是增强和切点的联合体,可以很方便的通过Spring提供的ProxyFactoryBean将切面自入不同的目标类中。 当然为每个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor可干涉Bean生命周期的机制,提供一些可以自动创建代理、自入切面的自动代理创建器,其中DefaultAdvisorAutoProxyCreator是功能强大的自动代理穿件器,它可以将容器中所有的Advisor自动织入目标Bean中。


    展开全文
  • spring-aop jar包需求

    千次阅读 2018-03-27 11:52:15
    SpringAop:的底层就是通过JDK动态代理"或"CGLib动态代理为技术目标织入横切逻辑。  做aop:需要导入:  spring-aop-4.1.5.RELEASE.jar spring-beans-4.1.5.RELEASE.jar spring-context-4.1.5.RELEASE....
    SpringAop:的底层就是通过JDK动态代理"或"CGLib动态代理为技术目标织入横切逻辑。
     做aop:需要导入:
      spring-aop-4.1.5.RELEASE.jar
    spring-beans-4.1.5.RELEASE.jar
    spring-context-4.1.5.RELEASE.jar
    spring-context-support-4.1.5.RELEASE.jar
    spring-core-4.1.5.RELEASE.jar

    cglib引入的包:
    cglib-nodep-2.1_3.jar


    aop联盟:schmeAop
    aopalliance-1.0.jar
    aspectj:基于注解aop

    aspectjweaver.jar



    org.springframework.aop.BeforeAdvice 前置通知:在目标方法之前,执行的业务逻辑 :MethodBeforeAdvice
    org.springframework.aop.AfterReturningAdvice 后置通知:在目标方法之后,执行的业务逻辑
    org.aopalliance.intercept.MethodInterceptor 环绕通知:目标方法执行前后,执行的业务逻辑(用的最多的)
    org.springframework.aop.ThrowsAdvice 异常通知:执行目标方法出现异常,执行的业务逻辑(几乎很少使用)
    org.springframework.aop.IntroductionInterceptor 引介通知.在目标类中添加了一些新的方法和属性的时候,执行的业务逻辑(几乎很少使用)
    展开全文
  • 如从下载spring-aop-5.0.2.RELEASE.jar,直接上Spring官网网站为: https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring-aop/5.0...

    从官网上下载开发所需jar包,会比从其他网站或者资源分享更方便也更安全。如从下载spring-aop-5.0.2.RELEASE.jar,直接上Spring官网网站为:
    https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring-aop/5.0.2.RELEASE/spring-aop-5.0.2.RELEASE.jar

    在这里插入图片描述

    比如从maven库下载AspectJ框架所提供的规范包aspectjweaver-1.8.13.jar:
    https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.8.13
    在这里插入图片描述

    展开全文
  • 实例导读Spring-AOP 自动创建代理Spring-AOP 自动创建代理之BeanNameAutoProxyCreatorSpring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreatorSpring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator...
  • Spring = IOC + AOP + TX spring4------->spring5 ==== boot1------->boot2 1.1 AOP常用的注解? 1.2 说说AOP全部通知顺序,boot1/2对AOP执行顺序的影响? 1.3 说说你使用AOP中遇到的坑? 二、Spring-AOP执行...
  • 文章目录1 简单回顾2 spring-aop目标对象的创建和初始化过程概述3 spring-aop目标对象的后置增强 --- AOP核心原理3.1 spring-aop目标对象的后置增强入口3.2 spring-aop核心源码解读3.3 spring-aop核心源码读后总结 ...
  • 实例导读Spring-AOP 自动创建代理Spring-AOP 自动创建代理之BeanNameAutoProxyCreatorSpring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator概述我们知道切面Advisor是切点和增强的复合体,Advisor本身已经包含...
  • 实例导读Spring-AOP 自动创建代理实例代码已托管到Github—> https://github.com/yangshangwei/SpringMaster在 Spring-AOP 静态普通方法名匹配切面 案例中,我们通过配置两个ProxyFactoryBean分别为waiter和seller的...
  • Spring-aop-4.3.2.jar包目录结构

    千次阅读 2016-12-02 08:47:25
    Spring-aop-4.3.2.jar包目录结构
  • Spring-AOP概念及使用教程

    千次阅读 多人点赞 2020-07-02 13:52:25
    Spring-AOP 1、AOP 基本概念 ​ (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 ​ (2)通俗描述...
  • Spring-AOP 引介切面

    千次阅读 2017-08-21 02:42:09
    实例概述之前的博文介绍了 Spring-AOP 通过配置文件实现 引介增强 ,引介切面是引介增强的封装器,通过引介切面可以很容易的为现有对象添加任何接口的实现。 引介切面类继承关系IntroductionAdvisor 和 ...
  • Spring-AOP 复合切点切面

    千次阅读 2017-08-20 15:50:37
    概述 ComposablePointcut源码 ComposablePointcut的构造函数 ComposablePointcut的3个交集运算的方法 ComposablePointcut的3个并集运算的方法 多个切点之间的交集并集运算 ...上篇博文 Spring-AOP 流程切面的例子,
  • Spring-Aop注解形式案例<二>

    万次阅读 2015-12-13 21:11:57
    Spring-Aop注解形式案例 问题?Spring-Aop注解形式案例 我们知道,在spring中,spring提供了注解的形式,来达到对象的依赖注入。当然我们也可以直接用依赖注入将bean 这里写的是Spring-Aop注解...
  • Spring-AOP @AspectJ切点函数导读

    千次阅读 2017-08-26 13:50:04
    target和this概述切点函数是AspectJ表达式语言的核心,也是使用@AspectJ进行切面定义的难点,本篇博文将为你揭开@AspectJ切点函数的神秘面纱@annotation()因篇幅原因,请查看另外一篇博文:Spring-AOP @AspectJ切点...
  • 其他代码概述在上篇博文的案例中 Spring-AOP 创建增强类-前置增强我们使用org.springframework.aop.framework.ProxyFactory通过编码的方式将GreetingBeforeAdvice的增强织入目标类NaiveWaiter中结合我
  • Spring-AOP切面+Aspectj框架的使用

    千次阅读 2016-03-31 17:52:09
    Spring-AOP切面+Aspectj框架的使用
  • 正则表达式工具 RegexBuddy概述在Spring-AOP 静态普通方法名匹配切面案例中 StaticMethodMatcherPointcutAdvisor中,仅能通过方法名定义切点,这种描述方式不够灵活,假设目标类中有多个方法,切满足一定的命名规范...
  • Spring-AOP概述

    千次阅读 2017-08-12 14:12:05
    概述 AOP是什么 AOP专业术语 连接点Joinpoint 切点Pointcut 增强Advice 目标对象Target 引介Introduction ...Spring AOP概述Spring AOPAOP技术在Spring中的具体实现,它是Spring框架的另外一个重要
  • Spring所依赖的AspectJ的注解jar包;Spring-aop注解jar包下载
  • 一、场景后台管理系统...-- https://mvnrepository.com/artifact/org.springframework/spring-aop --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; ...
  • AOP(Aspect-Oriented Programming):面向切面编程 是一种通过预编译方式和运行期动态代理实现在...spring-aop-4.2.5.RELEASE.jar aopalliance-1.0.jar aspectjweaver-1.6.9.jar cglib-nodep-2.1_3.jar使用AOP之前先
  • Spring-AOP @AspectJ切点函数之@annotation()

    万次阅读 2017-08-27 13:12:57
    annotation概述 实例@annotation()概述代码已托管到Github—> ... 下面通过一个实例说明@annotation()的用法。 AnnotationTestAspect定义了一个后置切面增强,该增强将应用到标注了NeedTest的目标方法
  • 下载失败 'https://repo1.maven.org/maven2/org/springframework/spring-aop/5.2.3.RELEASE/spring-aop-5.2.3.RELEASE.jar': Cannot download 'https://repo1.maven.org/maven2/org/springframework/spring-a...
  • 运行后报了一大堆错误,挺吓人的,不要怕,这写错误可能是...Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Er...
  • spring-AOPAOP获取request各项参数

    万次阅读 2018-07-14 16:37:21
    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待。 一 AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 JointPoint(连接点):程序执行过程...
  • Spring-Aop详细教程

    万次阅读 2015-12-13 17:40:56
    SpringAop的定义及使用 Aop定义: aop:  1、切面  事务、日志、安全性框架、权限等都是切面  2、通知  切面中的方法就是通知  3、目标类  4、切入点  只有符合切入点,才能...
  • Spring-AOP @AspectJ切点函数之@within()和@target

    万次阅读 热门讨论 2017-09-05 06:12:19
    概述 targetM的匹配规则 withinM的匹配规则 实例 target within 注意事项概述除了@annotation和@args外,还有另外两个用于注解的切点函数,分别是@target和@within.... 其中@target(M)匹配任意标注了@M的目标类,而@...
  • Spring-AOP 流程切面

    千次阅读 2017-08-20 05:26:57
    概述 实例 总结概述Spring的流程切面由DefaultPointcutAdvisor和ControlFlowPointcut实现。... 实例代码已托管到Github—> https://github.com/yangshangwei/SpringMasterpackage com.xgj.aop.spring.advisor.ControlFl
  • Spring-AOP 静态普通方法名匹配切面

    万次阅读 2017-08-19 01:06:09
    概述 实例概述StaticMethodMatcherPointcutAdvisor代表一个静态方法匹配切面,它通过StaticMethodMatcherPointcut来定义切点,并通过类过滤和方法名来匹配所定义...业务类Waiterpackage com.xgj.aop.spring.advisor.St

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 355,198
精华内容 142,079
关键字:

spring-aop

spring 订阅