Spring笔记(2)

Spring笔记(2)

一、AOP简介

1.概念:

  • 面向切面编程(Aspect-Oriented Programming),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。

  • AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

2.作用

在程序运行期间,在不修改源码的情况下对方法进行功能的增强

  • 日志记录,性能统计,安全控制,事务处理,异常处理等等wn及扩展

3.底层实现

AOP的动态代理技术

JDK代理

基于接口的动态代理技术

image-20210318161029482

cglib代理

基于父类动态代理技术

image-20210318161056876

4.知识要点

aop:面向切面编程

aop底层实现:基于jdk的动态代理和基于cglib的动态代理

aop的重点概念:

  • ​ Pointcut(切入点):被增强的方法
  • ​ Adivce(通知/增强):封装增强业务逻辑的方法
  • ​ Aspect(切面):切点+通知
  • ​ Weaving(织入):将切点与通知结合的过程

二、基于XML的AOP开发

1.快速入门

步骤

  1. 添加坐标,spring-context 和 aop

    <!--    spring-context-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
    <!--    aop-->
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.13</version>
        </dependency>
      </dependencies>
    
  2. 创建目标接口并实现目标接口(连接点,切入点)

    //接口类
    public interface TargetInterface {
        public void save();
    }
    
    //实现类
     @Override
        public void save() {
            System.out.println("saving..");
        }
    
  3. 创建切面类(内写增强方法)

    //切面类
    public class MyAspect {
        public void before(){
            System.out.println("前置增强。。。");
        }
    }
    
  4. 创建applicationContext.xml文件,并将目标对象切面类注入

    <!--    目标对象-->
        <bean id="target" class="AopLearn.Target"></bean>
    
    
    <!--    切面对象-->
        <bean id="myAspect" class="AopLearn.MyAspect"></bean>
    
  5. 引入aop命名空间

    xmlns:aop="http://www.springframework.org/schema/aop"
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    
  6. 配置织入,告诉spring框架,哪些方法(切点)需要进行那些增强(前置、后置)

        <aop:config>
    <!--        声明切面-->
            <aop:aspect ref="myAspect">
    <!--            声明切点和通知-->
                <aop:before method="before" pointcut="execution(public void AopLearn.Target.save())">
            </aop:aspect>
        </aop:config>
    

2.切点表达式

表达式语法:

​ execution([修饰符] 返回值类型 包名.类名.方法名(参数))

注:

  • 返回值类型、包名、类名、方法名可以使用星号*代表任意
  • 访问修饰符可以省略
  • 包名与类名之间一个点.代表当前包下的类,两个点表示当前包及其子包下的类
  • 参数列表可以使用两个点…示任意个数,任意类型的参数列表

常用:

excution( com itheima.app. .* (..));**

​ 任意返回值 it黑马aop包下的 任意类的 任意方法

抽取(易于维护 ):

<!--            抽取切点表达式-->
            <aop:pointcut id="myPointcut" expression="execution(* AopLearn.*.*(..))"/>
<!--            使用抽取的切点表达式-->
            <aop:before method="before" pointcut-ref="myPointcut"/>

3.通知的类型

  • 前置通知:调用目标组件前,调用方面组件(before)

  • <aop:before method="before" pointcut="execution(public void AopLearn.Target.save())"></aop:before>
    
  • 后置通知:调用目标组件后,调用方面组件(after-returning)

  • 最终通知:调用目标组件后,在finally里调用方面组件(after)

  • 异常通知:目标组件发生异常时,调用方面组件。(after-throwing)

  • 环绕通知:调用目标组件前、后,分别调用一次方面组件。(around)

三、基于注解的AOP开发

1.快速入门

  1. 创建目标接口目标类

  2. 创建切面类

  3. 将目标类和切面类的创建权交给Spring管理,并设置切面类标识。 (生成bean

    
    //实现bean的注入
    @Component("target")
    public class Target implements TargetInterface {
        @Override
        public void save() {
            System.out.println("saving..");
        }
    }
    
    //实现bean的注入
    @Component("myAspect")
    //配置为切面类
    @Aspect
    public class MyAspect {
        //注解配置织入关系
        @Before("execution(* Annotation.*.*(..))")
        public void before(){
            System.out.println("anno前置增强。。。");
        }
    }
    
  4. 在切面类中使用注解配置织入关系

    public class MyAspect {
        //注解配置织入关系
        @Before("execution(* Annotation.*.*(..))")
        public void before(){
            System.out.println("anno前置增强。。。");
        }
    }
    
  5. 创建context命名空间

  6. 在配置文件中开启组件扫描AOP的自动代理

    <!--        开启组件扫描-->
            <context:component-scan base-package="Annotation"/>
    <!--    aop自动代理-->
            <aop:aspectj-autoproxy/>
    
  7. 测试

    @Test
    public void test02(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext-anno.xml");
        TargetInterface target = app.getBean(TargetInterface.class);
        target.save();
    }
    

2.切点表达式

抽取

/**
 * 定义切点表达式
 */
@Pointcut("execution(* Annotation.*.*(..))")
public void pointcut(){}

配置织入关系

@Before("pointcut()")
public void before(){
    System.out.println("anno前置增强。。。");
}

3.通知的类型

  • @Before — 前置通知

  • @AfterReturning — 后置通知

  • @Around — 环绕通知(目标对象默认不执行,需要手动执行)

  • @After — 最终通知

  • @AfterThrowing — 异常抛出通知

4.注意

使用@Aspect标注切面类

一定配置aop自动代理

<!--    aop自动代理-->
        <aop:aspectj-autoproxy/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115201.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月11日 下午10:00
下一篇 2021年11月11日 下午10:00


相关推荐

  • 科大讯飞离线语音命令词识别的使用说明

    科大讯飞离线语音命令词识别的使用说明

    2026年3月14日
    4
  • JvisualVM_jvm详解

    JvisualVM_jvm详解VisualVM是Netbeans的profile子项目,已在JDK6.0update7中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\ProgramFiles\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualv…

    2025年7月22日
    6
  • DynamoDB常见问题

    DynamoDB常见问题什么是 DynamoDB 问 什么是 AmazonDynamo AmazonDynamo 是一项完全托管的 NoSQL 数据库服务 提供快速而可预测的性能 能够实现无缝扩展 使用 AmazonDynamo 客户可以将运行和扩展分布式数据库的管理工作负担交给 AWS 因而无需担心硬件预配 设置和配置 复制 软件更新或集群扩展等问题 问 AmazonDynamo 可以代我进行哪

    2026年3月19日
    2
  • 随机梯度下降SGD算法实现_什么是梯度下降法

    随机梯度下降SGD算法实现_什么是梯度下降法随机梯度下降算法(Stochasticgradientdescent,SGD)在神经网络模型训练中,是一种很常见的优化算法。这种算法是基于梯度下降算法产生的,所以要理解随机梯度下降算法,必须要对梯度下降算法有一个全面的理解。梯度下降:这个算法我在之前的博文LogisticRegression的数学推导过程以及Python实现中有详细的说明介绍,这里我们再来简单回顾一下梯度下降算法:假设…

    2025年10月18日
    4
  • Eigen编译_Eigen向量化_内存对齐 EIGEN_MAKE_ALIGNED_OPERATOR_NEW

    Eigen编译_Eigen向量化_内存对齐 EIGEN_MAKE_ALIGNED_OPERATOR_NEW目录 1 缘起 2 什么是向量化运算 2 1ASimpleExam 2 重构 2 3HeapvsStack 4 还有坑 3 再谈 Eigen4 总结 1 缘起 Eigen 是一个非常常用的矩阵运算库 至少对于 SLAM 的研究者来说不可或缺 然而 向来乖巧的 Eigen 近来却频频闹脾气 把我的程序折腾得死去活来 我却是丈二和尚摸不着头脑 简单说说我经历的灵异事件 我的程序原本在 NVIDIATX2 上跑的好好的 直到有一天 我打算把它放到服务器上 看看传说中的 RT

    2026年3月17日
    2
  • linux抓包教程_ubuntu抓包命令

    linux抓包教程_ubuntu抓包命令linux抓捕网络包jacky.1650727278@@q.comtcpdump是linux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是centos7。tcpdump的命令格式tcpdump的参数众多,通过mantcpdump可以查看tcpdump的详细说明,这边只列一些笔者自己常用的参数:tcpdump[-i网卡]-nnAX‘表达式’各参数说明…

    2022年10月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号