一、AOP简介

1.概念:

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

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

2.作用

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

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

3.底层实现

AOP的动态代理技术

JDK代理

基于接口的动态代理技术

cglib代理

基于父类动态代理技术

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

Spring笔记(2)的更多相关文章

  1. Spring笔记02_注解_IOC

    目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...

  2. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  3. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  4. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  5. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

  6. Spring:笔记整理(1)——HelloWorld

    Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...

  7. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  8. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  9. spring笔记----看书笔记

    上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...

  10. Spring 笔记(三)Bean 装配

    前言 Spring 有两大核心,也就分成两份笔记分别记录. 其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring). 基于 JavaConfig 的 ...

随机推荐

  1. 第三篇 -- HTML基础

    买的课程学习 Web 前端标准 web前端技术指的不是某一项技术,而是一系列技术的集合,主要包括: html -- 结构标准:负责网页结构的搭建 css -- 样式标准/表现标准:负责网页的美化工作 ...

  2. Python脚本:批量将.doc文件转化为.docx文件

    将.doc转换为.docx文件有几种常用的方法: Microsoft Word 和 WPS 自带.doc转换.docx功能,但只能一个文件一个文件转换,批量转换要会员 在线网页 Office-Conv ...

  3. (python函数01)enumerate函数

    enumerate函数 enumerate函数示例代码01运行结果01示例代码02运行结果02 enumerate(枚举,列举)是python的内置函数,enumerate的参数为可迭代对象,如字符串 ...

  4. Android 帧动画使用

    帧动画 使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画.也可以比喻为像一卷胶卷一样按顺序播放. 播放起来,有点像在看gif图. 本文介绍使用AnimationD ...

  5. DC-9 靶机渗透测试

    DC-9 渗透测试 冲冲冲,好好学习 DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已. 靶机IP: 172.66.66.139 kali ...

  6. 04.委托Delegation

    1. 基本了解 1.1 委托简述 官方文档 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用,用于将方法作为参数传递给其他方法,可将任何可访问类或结构中与委托类型匹配的任何方法分配给委 ...

  7. IPSec组播概要

    IPSec作为主流IP安全协议之一,在单播环境下,特别是在VPN场景中应用广泛.但是在组播环境貌似看到的不多,通过RFC4301了解到IPSec首先是支持组播的,即通过手动配置的方式可以实现组播包加密 ...

  8. Java面向对象14——接口

    接口  package oop.demon01.demon09; ​ //抽象思维~Java ​ //interface 定义的关键字 , 接口都需要有实现类 public interface Use ...

  9. CCS box-flex属性

    box-flex==按比例分配父标签的宽度or高度空间 1.非固定分配 eg.一块地总150平方分配给三孩子,按照2:1:1分 #老大 { 房子-分配: 2; } = 75平 #老二 { 房子-分配: ...

  10. Javac 编译器

    编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法 ...