首先解释下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. ROC

    # -*- coding: utf-8 -*- # __author__ = "JieYao" from biocluster.agent import Agent from bi ...

  2. 将object格式转为json格式

    在页面内容显示时,有时需要用到json格式.但数据库内容的显示,需要将数据库中获取的格式转为json: using Newtonsoft.Json;public static string ToJso ...

  3. php中数据类型自动转换

    1.1 转为布尔型(即返回值为0) 空字符串''或"" 数字0或0.0 字符'0'或"0" 空值NULL 没有成员的数组    其余都转换成布尔型true,包含 ...

  4. ASP.NET CORE 学习之原生DI实现批量注册

    以前使用Autofac的时候,只需一句AsImplementInterfaces()就可以很轻松实现批量注册功能.而asp.net core内置的DI框架没有现成的批量注册方法,考虑到替换Autofa ...

  5. zookeeper(二):linux centos下安装zookeeper(单机和集群)

    下载 http://zookeeper.apache.org/releases.html 解压 tar –zxvf zookeeper-3.4.6.tar.gz 解压文件到"/usr/loc ...

  6. atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结

    atitit.企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结 1. 战略规划,适当的过度设计 1 2. 跨平台化 1 3. 可扩展性高于一切 1 4. 界面html5化 2 5.  ...

  7. makefile之origin函数

    origin 函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量. 函数语法: $(origin ) 为变量的名字,而不是引用,所以一般没有"$"字符在前. orig ...

  8. 5.14日学习内容1:jquery表单相关知识

    <script> $comment.animate({height:'+=50'},400);//在原来的基础上加50: $('.smaller').click(function(){ i ...

  9. Linux_Command

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  10. Struts1小案例问题教训总结(含中文乱码问题及解决)

    1. 提交form后页面空白,没有任何显示,Debug发现form的validate()以及action的execute()根本没有被调用. 原因:validate()和execute()有2个互为o ...