首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法、指定位置上的编程思想就是面向切面编程

  • 一般而言,我们管切入到指定类指定方法的代码片段为切面,而切入的哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时在切入对象中去,从而改变其原有的行为。
  • AOP就是OOP的补充而已。OOP从横向上区分出一个个类来,而AOP则从纵向上向对象加入特定的代码。有了AOP,OOP变得立体了,如果加上时间维度,AOP使OOP从二维变成三维。
  • 从技术上来说,AOP基本上是通过代理机制实现的。
  • 经典的Spring AOP是基于动态代理技术的。在实现方式上,最常用的是实现MethodInterceptor接口来提供环绕通知,创建若干代理,然后使用ProxyBeanFactory配置工厂Bean,生成拦截器链,完成拦截。
  • 我们通常使用注解的形式使用AOP

      • 在xml中的配置

        • <context:component-scan base-package="demo.spring"/>
        • <aop:aspectj-autoproxy />
      • context:component-scan,使用@Component自动发布bean,需要配置这个元素
      • aop:aspectj-autoproxy,使用@AspectJ及其它AOP注解需要配置,否则无法使用注解;@AspectJ注解,将@Component自动发布出来的"interceptor" bean转换为一个aspectj切面,而@Pointcut、@Before、@After、@Around等注解,功能与在xml文件中配置是一样的;@Pointcut注解下面的方法内容无意义,只是要求一个相应方法提供注解依附。
      • 注解只能使用在能活的源码的场景,如果不能获取源码,则只能通过xml配置的形式,将制定的对象配置成拦截器,对指定目标进行拦截;因此,通过xml文件配置,而不是注解,是更加通用的方式。
      • 除基础的springframework框架的jar外,还需要依赖cglib、aspectj的jar包,maven配置如下:
      <dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
    </dependency>
    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.</version>
    </dependency>
总结:Spring实现AOP,动态代理技术的两种实现是jdk动态代理、cglib代理,根据被通知的方法是否为接口方法,来选择使用哪种代理生成策略。
  • jdk动态代理:原理是实现接口的实例,拦截定于接口中的目标方法,,性能更优,是spring生成代理的优先选择。
  • cglib代理:原理是使用cglib库中的字节码动态生成技术,生成被代理类的子类实例,可以拦截代理类中的任一public方法的调用,无论目标方法是否定义与接口中,更通用,但性能相对jdk代理差一些。

面试题思考:什么是基于注解的切面实现?(AOP是Aspect Oriented Program的首字母缩写)的更多相关文章

  1. 一步一步深入spring(5)--使用基于注解的spring实现 AOP

    1.要利用spring aop,至少需要添加以下jar包 使用spring需要的jarspring.jar .commons-logging.jar 使用切面编程(AOP)需要的jar aspectj ...

  2. 使用Spring框架入门四:基于注解的方式的AOP的使用

    一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...

  3. 基于注解方式@AspectJ的AOP

    启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置: <aop:aspectj-autoproxy/> 这样Spring就能发现@ ...

  4. 在Mybatis-spring上基于注解的数据源实现方案

    一.遇到的痛点 最近在学习Spring-boot过程中,涉及到操作数据库.按照DOC引入mybatis-spring-boot-starter,然后按照套路配置application.properti ...

  5. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  6. Spring AOP:面向切面编程,AspectJ,是基于注解的方法

    面向切面编程的术语: 切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象 通知(Advice): 切面必须要完成的工作 目标(Target): 被通知的对象 代理(Pr ...

  7. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  8. springAOP基于注解的使用方法和实现原理

     springAOP即面向切面编程,可以在方法执行过程中动态的织入增强逻辑,其使用步骤为: 1. 导入aop模块的jar包,或在maven中添加依赖:spring-aspects 2. 定义目标类和目 ...

  9. Spring Aop(七)——基于XML配置的Spring Aop

    转发:https://www.iteye.com/blog/elim-2396043 7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然 ...

随机推荐

  1. 【DB2】NULLS LAST与NULLS FIRST

    DB2函数配合 select row_number() over(order by col desc nulls first/nulls last ) as rn,col from table1ord ...

  2. Python-正确使用Unicode

    正确处理文本,特别是正确处理Unicode.是个老生常谈的问题,有时甚至会难倒经验丰富的开发者.并不是因为这个问题很难,而是因为对软件中的文本,开发者没有正确理解一些关键概念及其表示方法.在Stack ...

  3. (C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹

    1 - 基础,浏览一个文件夹 我们知道,在win32中是以外壳名字空间的形式来组织文件系统的,在外壳名字空间里的每一个对象(注)都实现了一个IShellFolder的接口,通过这个接口我们可以直接查询 ...

  4. eclipse项目 乱码

  5. 使用AsParallel 进行并行化处理数据

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  6. iOS 9应用开发教程之ios9中实现button的响应

    iOS 9应用开发教程之ios9中实现button的响应 IOS9实现button的响应 button主要是实现用户交互的.即实现响应.button实现响应的方式能够依据加入button的不同分为两种 ...

  7. Build System 和Test Framework overview总结

    良好的自动化系统可以帮助Dev/Tester快速发现product/test code issue. 正好上一个项目结束,上个项目在自动化系统上面做得非常好.从产品开始时半年release一次到后面每 ...

  8. TLS线程局部存储

    0x01 TLS (Thread Local Storage) 为线程单独提供的私有空间 0x02 gcc中的隐式TLS使用方法 隐式TLS __thread int number; 显式TLS pt ...

  9. Unity对象与Draw Calls的关系

    什么是Draw Calls? 首先我们先来了解一下,什么叫做“Draw Calls”:一个Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawEle ...

  10. linux下的which

    which命令用来查找并打印可执行文件的绝对路径. 他会根据PATH环境变量定义的路径来依此查找可执行文件. 需要注意的是,指向可执行文件的链接文件在查找中会被忽略. 比如env命令: ll /usr ...