zoukankan      html  css  js  c++  java
  • jdk aop基本配置与理解1

    一、到底什么是AOP(面向切面编程)?

    无论在学习或者面试的时候,大家都会张口说spring的特性AOP和IOC(控制反转咱们下一篇讲),有些大神理解的很到位,但是对于大多数初中级工程师来讲还是模糊阶段,但是为什么会有AOP这种技术呢?傻瓜都知道:为了开发者的方便!!!!就是为了我们少写代码,省劲!要记住上面我说的话!

    下面我举个例子给大家说明一下:

    有A,B,C三个方法,但是在调用每一个方法之前,要求打印一个日志:某一个方法被开始调用了!

    在调用每个方法之后,也要求打印日志:某个方法被调用完了!

    一般人会在每一个方法的开始和结尾部分都会添加一句日志打印吧,这样做如果方法多了,就会有很多重复的代码,显得很麻烦,这时候有人会想到,为什么不把打印日志这个功能封装一下,然后让它能在指定的地方(比如执行方法前,或者执行方法后)自动的去调用呢?如果可以的话,业务功能代码中就不会掺杂这一下其他的代码,所以AOP就是做了这一类的工作,比如,日志输出,事务控制,异常的处理等。。

    如果把AOP当做成给我们写的“业务功能”增添一些特效,就会有这么几个问题:

    1.我们要制作哪些特效

    2.这些特效使用在什么地方

    3.这些特效什么时候来使用

    二、有了这三个疑问,加上上面的讲解,下面我们来说一下AOP的一些术语(一下看不懂不要紧,慢慢理解)

    1.通知(Advice)
      就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。

        2.连接点(JoinPoint)
      这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。

        3.切入点(Pointcut)
      上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

        4.切面(Aspect)
      切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

        5.引入(introduction)
      允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗

        6.目标(target)
      引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。

        7.代理(proxy)
      怎么实现整套aop机制的,都是通过代理,这个一会给细说。

        8.织入(weaving)
      把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。

      关键就是:切点定义了哪些连接点会得到通知
    ---------------------
    作者:善良的healer
    来源:CSDN
    原文:https://blog.csdn.net/qq_32317661/article/details/82878679
    版权声明:本文为博主原创文章,转载请附上博文链接!



    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- 配置模拟的事务管理器 --> <!-- what : 事务处理 --> <bean id="txManager" class="cn.zj.spring.util.MyTransactionManager"/> ---->切面class <!-- 配置service实现类 --> <bean id="service" class="cn.zj.spring.service.impl.UserServiceImpl"/> --->切入点中的类 <!-- 开始 Spring AOP 配置 SpringAOP 遵循 www 原则 w:what? w:where? w:when? 什么时候在哪个地方干什么 在service层insert方法执行之前开启事务 --> <!-- 开始配置 --> <aop:config > <!-- 配置切入点:where? expression : 切入点配置,有具体语法规则 id : 切入点语法的唯一标识 --> <aop:pointcut expression="execution(* cn.zj.spring.service..*.*(..))" id="pt"/> ---->切入点 <!-- 配置切面 = 切入点(pointcut)+ 通知/增强(advice) ref : 引入需要增强的事务管理器 --> <aop:aspect ref="txManager"> --->映射切面class <!-- when :时机?(之前,之后,异常,最终) --> <!-- advice:前置增强 (开始事务) method :要增强的方法名称 --> <aop:before method="begin" pointcut-ref="pt"/> <!-- 后置增强 --> <aop:after-returning method="commit" pointcut-ref="pt"/> <!-- 异常增强 throwing : 异常,值 必须和对应方法名称的 参数名称一样 抛出的是顶级异常Throwable --> <aop:after-throwing method="rollback" pointcut-ref="pt" throwing="ex"/> <!-- 最终增强 --> <aop:after method="close" pointcut-ref="pt"/> </aop:aspect> <!-- Weaving:织入,在运行阶段spring处理 --> </aop:config> </beans>

      

  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/cqming/p/11007781.html
Copyright © 2011-2022 走看看