框架之spring(二)

来源:互联网 发布:设计房子的软件 编辑:程序博客网 时间:2024/06/03 15:08
一.AOP概述
    1.什么是AOP:(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,是函数式编程的一种衍生泛型,利用AOP可以对业务逻辑的各个部分进行隔离,从而是的业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率.
    2.AOP思想分析:
        优势:在不修改源码的情况下,对程序进行增强
        常见引用场景:权限校验/日志记录/性能监控/事务控制/统计执行效率
    3.AOP的底层实现原理
        实现原理:使用动态代理技术
        代理主要作用:拦截被代理对象执行的方法,同时对方法进行增强
        静态代理与动态代理:
            静态代理:代理类是一个真实存在的类,装饰着模式就是静态代理的一种体现形式
            动态代理:字节码是随用随创建,随用随加载,是在运行期生成的一个类
                a.基于接口的动态代理,被代理类必须实现一个或者多个接口
                b.基于子类的动态代理,被代理类必须是一个子类(不能用final修饰)
二.spring中AOP的基本概念
    1.Joinpoint(连接点)
        所谓连接点是类中的核心业务方法(业务层实现需求的方法),在spring中,这些点指的是方法,因为方法只支持方法类型的连接点
    2.Pointcut(切入点)
        所谓的切入点是我们对哪些连接点进行功能的增强,连接点不一定是切入点,切入点一定是连接点
    3.Advice(通知/增强)
        所谓通知是哪些具有公共代码的类(那些有增强代码的类),通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
        *环绕通知:比较特殊的一个,它不是配置在切入点方法前后执行的顺序,而是spring提供给我们的一种方式,让我们自己在代码中决定该通知何时织入核心业务方法
  1. @Pointcut("execution(* com.zjl.transfer.service.impl.*.*(..))")
  2. private void p1(){
  3. }
  4. @Around("com.zjl.transfer.utils.LoggerUtils.p1()")
  5. public static void aroundPrintLog(ProceedingJoinPoint pjp){
  6. try {
  7. System.out.println("aroungPrintLog开始记录日志,before");
  8. pjp.proceed();
  9. System.out.println("aroundPrintLog结束记录日志,after");
  10. } catch (Throwable e) {
  11. System.out.println("aroundPrintLog异常记录日志,exception");
  12. e.printStackTrace();
  13. }finally{
  14. System.out.println("aroundPrintLog最终记录日志,finally");
  15. }
  16. }
    4.Introduction(引介)
        引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些method和field
    5.Target(目标对象)
        代理的目标对象
    6.Weaving(织入)
        是指把增强应用到目标对象来创建新的代理对象的过程
        spring采用动态代理织入,而AspectJ采用编译器织入和类装载期织入
    7.Proxy(代理)
        一个类被AOP织入增强后就产生了一个结果代理类
    8.Aspect(切面)
        公用代码(通知)所关心的某一方面
三.基于xml的AOP配置
    1.导入与AOP有关的jar包,(由于AOP是局域ioc的,所以也要导入ioc的jar包)

        aopalliance-1.0.jar

        aspectjweaver-1.8.7.jar

        spring-aop-4.2.4.RELEASE.jar

        spring-aspects-4.2.4.RELEASE.jar

        b、引入aop名称空间

       <?xml version="1.0"encoding="UTF-8"?>

        <beansxmlns="http://www.springframework.org/schema/beans"

           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/aop

                           http://www.springframework.org/schema/aop/spring-aop.xsd">

            <beans/>    
    2.配置切面
  1. <bean id="loggerAdvice" class="com.zjl.spring.Logger"></bean>
  2. <!-- 配置AOP:配置切面和连接点之间的关系 -->
  3. <aop:config>
  4. <!-- 配置切面 ref指定的通知对象的引用 -->
  5. <aop:aspect ref="loggerAdvice">
  6. <!-- 配置前置通知 :before是前置通知。 method:指定的是哪个方法是前置通知方法
  7. pointcut:指定的哪些连接点将变成切入点。需要使用的是切入点表达式。
  8. 写法:execution(表达式)
  9. 例如:
  10. public void com.zjl.spring.UserServiceImpl.saveUser()
  11. pointcut-ref:引用定义好的公用的切入点
  12. -->
  13. <aop:before method="printLog" pointcut="execution(public void com.zjl.spring.UserServiceImpl.saveUser())"/>
  14. </aop:aspect>
  15. </aop:config>
    3.切入点表达式的写法:
  1. execution:匹配方法的执行(常用)
  2. execution(public * *(..))
  3. 基本语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
  4. within:匹配包或子包中的方法(了解)
  5. within(com.zjl.aop..*)
  6. this:匹配实现接口的代理对象中的方法(了解)
  7. this(com.zjl.aop.user.UserDAO)
  8. target:匹配实现接口的目标对象中的方法(了解)
  9. target(com.zjl.aop.user.UserDAO)
  10. args:匹配参数格式符合标准的方法(了解)
  11. args(int,int)
  12. Spring支持使用如下三个逻辑运算符来组合切入点表达式:
  13. &&:要求连接点同时匹配两个切点表达式
  14. ||:要求连接点匹配至少一个切入点表达式
  15. !:要求连接点不匹配指定的切入点表达式
    4.配置通用的切入点表达式
        公用的切入点表达式:<aop:pointcut expression="excution(* *..*.*(..)) " id="pt1" />
        配置通知:<aop:before method=" " pointcut-ref="pt1" />

四.基于注解的AOP配置
    1.开发步骤
  1. a、导入aopjar
  2. xml配置导入的包相同。
  3. b、导入aopcontext名称空间
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xmlns:context="http://www.springframework.org/schema/context"
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  12. </beans>
  13. c、开启SpringAspectJ的支持
  14. <context:component-scan base-package="com.zjl"></context:component-scan>
  15. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    2.常用注解
        *切面注解:@Aspect,把当前类看做是一个切面
        *@Pointcut,定义切入点表达式
        *通知类注解:
            *@Before  @AfterReturning   @AfterThrowing   @After  @Around




























            
0 0
原创粉丝点击