SpringAOP(一)

简介: SpringAOP(一)

一、AOP


1. AOP简介


问题导入


问题1:AOP的作用是什么?


问题2:连接点和切入点有什么区别,二者谁的范围大?


问题3:请描述什么是切面?


1.1 AOP简介和作用


AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构

OOP(Object Oriented Programming)面向对象编程

作用:在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基础上对方法进行功能增强。

Spring理念:无入侵式/无侵入式


1.2 AOP中的核心概念


db8796f09d436dd81276d24c532e83de_190f5ddaa8cb1ed6f9e0f457bdcb904b.png


连接点(JoinPoint):正在执行的方法,例如:update()、delete()、select()等都是连接点。

切入点(Pointcut):进行功能增强了的方法,例如:update()、delete()方法,select()方法没有被增强所以不是切入点,但是是连接点。

在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

一个具体方法:com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法

匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

通知(Advice):在切入点前后执行的操作,也就是增强的共性功能

在SpringAOP中,功能最终以方法的形式呈现

通知类:通知方法所在的类叫做通知类

切面(Aspect):描述通知与切入点的对应关系,也就是哪些通知方法对应哪些切入点方法。


2. AOP入门案例【重点】


问题导入


问题1:在通知方法中如何定义切入点表达式?


问题2:如何配置切面?


问题3:在配置类上如何开启AOP注解功能?


2.1 AOP入门案例思路分析


案例设定:测定接口执行效率

简化设定:在接口执行前输出当前系统时间

开发模式:XML or 注解

思路分析:

导入坐标(pom.xml)

制作连接点方法(原始操作,dao接口与实现类)

制作共性功能(通知类与通知)

定义切入点

绑定切入点与通知关系(切面)


2.2 AOP入门案例实现


【第一步】导入aop相关坐标


<dependencies>
    <!--spring核心依赖,会将spring-aop传递进来-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <!--切入点表达式依赖,目的是找到切入点方法,也就是找到要增强的方法-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
</dependencies>


c9df60ccd390f728f6ff8574db452a2c_35801bb4ba5e553921b31a2bcfd50bdd.png


【第二步】定义dao接口与实现类


public interface BookDao {
    public void save();
    public void update();
}
@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save ...");
    }
    public void update(){
        System.out.println("book dao update ...");
    }
}



【第三步】定义通知类,制作通知方法


//通知类必须配置成Spring管理的bean
@Component
public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}


【第四步】定义切入点表达式、配置切面(绑定切入点与通知关系)


//通知类必须配置成Spring管理的bean
@Component
//设置当前类为切面类类
@Aspect
public class MyAdvice {
    //设置切入点,@Pointcut注解要求配置在方法上方
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    //设置在切入点pt()的前面运行当前操作(前置通知)
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}


05649032e06b670f2f1ad0da87a6f2c4_2c09c8f46bcd5de73b5e97002a4d1cfd.png


【第五步】在配置类中进行Spring注解包扫描和开启AOP功能


@Configuration
@ComponentScan("com.itheima")
//开启注解开发AOP功能
@EnableAspectJAutoProxy
public class SpringConfig {
}


【第六步】测试类和运行结果


public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.update();
    }
}


75749add7e35dadf8865f248bad580fc_0b62d2ee37409aa8d7858ee27189d906.png


3. AOP工作流程


问题导入


什么是目标对象?什么是代理对象?


3.1 AOP工作流程


Spring容器启动

读取所有切面配置中的切入点

初始化bean,判定bean对应的类中的方法是否匹配到任意切入点

匹配失败,创建原始对象

匹配成功,创建原始对象(目标对象)的代理对象

获取bean执行方法

获取的bean是原始对象时,调用方法并执行,完成操作

获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作


3.2 AOP核心概念


目标对象(Target):被代理的对象,也叫原始对象,该对象中的方法没有任何功能增强。

代理对象(Proxy):代理后生成的对象,由Spring帮我们创建代理对象。


3.3 在测试类中验证代理对象


public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.update();
  //打印对象的类名
        System.out.println(bookDao.getClass());
    }
}


6afd6acfb0c0b1f4aee40e3d621ca8f3_eea6c4a84b41961050062cf993948f93.png

相关文章
|
安全 数据处理 网络虚拟化
|
数据可视化 物联网 Swift
谷歌发布开源LLM Gemma,魔搭社区评测+最佳实践教程来啦!
Gemma是由Google推出的一系列轻量级、先进的开源模型,他们是基于 Google Gemini 模型的研究和技术而构建。
|
11月前
|
存储 Java
【干货来了】如何使用 MuleSoft 合并多个 PDF
【干货来了】如何使用 MuleSoft 合并多个 PDF
147 4
|
Oracle 关系型数据库 MySQL
OceanBase数据库简介
【8月更文挑战第9天】OceanBase数据库简介
1177 60
针对报错:java.lang.Integer cannot be cast to java.lang.Long..的解决办法
针对报错:java.lang.Integer cannot be cast to java.lang.Long..的解决办法
4851 0
针对报错:java.lang.Integer cannot be cast to java.lang.Long..的解决办法
|
缓存 DataWorks 安全
DataWorks产品使用合集之如何创建表
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
174 9
|
自然语言处理 数据可视化 算法
【传知代码】私人订制词云图-论文复现
本文介绍了词云图的原理和生成步骤,包括分词、统计词频、去除停用词等,并提供了Python实现示例,利用`wordcloud`和`jieba`库。此外,还分享了技巧,如处理中文乱码、选择背景图、词库转换及自定义文字颜色。词云图能直观展示文本关键信息,适用于数据分析和文本挖掘,但也有其局限性,如无法显示词汇的语法关系。源码和更多资源可在文章附件获取。
294 0
【传知代码】私人订制词云图-论文复现
|
SQL 存储 Python
Microsoft SQL Server 编写汉字转拼音函数
Microsoft SQL Server 编写汉字转拼音函数
|
机器学习/深度学习 分布式计算 大数据
【大数据技术】Spark MLlib机器学习特征抽取 TF-IDF统计词频实战(附源码和数据集)
【大数据技术】Spark MLlib机器学习特征抽取 TF-IDF统计词频实战(附源码和数据集)
186 1
|
关系型数据库 MySQL
mysql 5.5.62版本建表语句报错: Index column size too large. The maximum column size is 767 bytes
mysql 5.5.62版本建表语句报错: Index column size too large. The maximum column size is 767 bytes
622 0