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


    首先解释下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.11</version>
      </dependency>
    总结:Spring实现AOP,动态代理技术的两种实现是jdk动态代理、cglib代理,根据被通知的方法是否为接口方法,来选择使用哪种代理生成策略。
    • jdk动态代理:原理是实现接口的实例,拦截定于接口中的目标方法,,性能更优,是spring生成代理的优先选择。
    • cglib代理:原理是使用cglib库中的字节码动态生成技术,生成被代理类的子类实例,可以拦截代理类中的任一public方法的调用,无论目标方法是否定义与接口中,更通用,但性能相对jdk代理差一些。
  • 相关阅读:
    xplan.sql(本脚本获取执行计划显示执行顺序)
    闪回查询(SELECT AS OF)
    闪回事务查询
    闪回版本查询
    闪回数据库
    shell循环语句
    前后端交互json字符串
    element vuex 语音播报
    highcharts中数据列点击事件
    highcharts为X轴标签添加链接
  • 原文地址:https://www.cnblogs.com/songanwei/p/9386462.html
Copyright © 2020-2023  润新知