Spring笔记(2)
一、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.快速入门
步骤
添加坐标,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>
创建目标接口并实现目标接口(连接点,切入点)
//接口类
public interface TargetInterface {
public void save();
} //实现类
@Override
public void save() {
System.out.println("saving..");
}
创建切面类(内写增强方法)
//切面类
public class MyAspect {
public void before(){
System.out.println("前置增强。。。");
}
}
创建applicationContext.xml文件,并将目标对象和切面类注入
<!-- 目标对象-->
<bean id="target" class="AopLearn.Target"></bean> <!-- 切面对象-->
<bean id="myAspect" class="AopLearn.MyAspect"></bean>
引入aop命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
配置织入,告诉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.快速入门
创建目标接口和目标类
创建切面类
将目标类和切面类的创建权交给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前置增强。。。");
}
}
在切面类中使用注解配置织入关系
public class MyAspect {
//注解配置织入关系
@Before("execution(* Annotation.*.*(..))")
public void before(){
System.out.println("anno前置增强。。。");
}
}
创建context命名空间
在配置文件中开启组件扫描和AOP的自动代理
<!-- 开启组件扫描-->
<context:component-scan base-package="Annotation"/>
<!-- aop自动代理-->
<aop:aspectj-autoproxy/>
测试
@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)的更多相关文章
- Spring笔记02_注解_IOC
目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...
- Spring笔记01_下载_概述_监听器
目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...
- Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)
Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...
- Spring笔记:事务管理
Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...
- Spring笔记:AOP基础
Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...
- Spring:笔记整理(1)——HelloWorld
Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- Spring笔记(6) - Spring的BeanFactoryPostProcessor探究
一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...
- spring笔记----看书笔记
上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...
- Spring 笔记(三)Bean 装配
前言 Spring 有两大核心,也就分成两份笔记分别记录. 其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring). 基于 JavaConfig 的 ...
随机推荐
- 关于hashcode和equals方法说明
一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...
- nodejs 文本逐行读写功能的实现
利用nodejs实现:逐行读写(从一个文件逐行复制到另外一个文件):逐行读取.处理和写入(读取一行,处理后,写入另一个文件) 1.所需要的模块: fs,os,readline 2.具体实现: a. 功 ...
- 智能停车场车牌识别系统【python】
百度AI:https://ai.baidu.com 申请App_id 代码重点:pip install baidu_api from aip import AipOcr import os # 百 ...
- python开发,注意事项
提高python代码运行效率 1.使用生成器,节约内存.[一边循环一边计算的机制,称为生成器:generator] 例: .如何创建生成器 1.只要把一个列表生成式的[]改成(),就创建了一个gene ...
- Mybatis学习笔记-缓存
简介 什么是缓存 **将一次查询的结果暂存至内存,后续查询只需查询缓存** 为什么使用缓存 **减少与数据库的交互次数,减少系统开销,提高系统效率** 什么样的数据能使用缓存 **经常查询且不常修改的 ...
- 庆FastGithub加入.NET Core Community
.NET Core Community .NET Core Community是一个基于并围绕着 .NET 技术栈展开组织和活动的非官方.非盈利性的民间开源社区,提供了很多优秀的 .NET 开源项目. ...
- vue 源码详解(一):原型对象和全局 `API`的设计
vue 源码详解(一):原型对象和全局 API的设计 1. 从 new Vue() 开始 我们在实际的项目中使用 Vue 的时候 , 一般都是在 main.js 中通过 new Vue({el : ' ...
- BUUCTF-[SUCTF 2019]CheckIn(.user.ini利用+exif_imagetype绕过)
目录 分析 .user.ini使用条件 解题 参考链接 记一道.user.ini利用+exif_imagetype绕过的文件上传的题. 分析 先正经上传一张图片.回显了存储路径,同时发现还包含了一个i ...
- A*算法寻路(C++代码实现)
A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法.算法中的距离估算值与实际值越接近,最终搜索速度越快.--来自百度百科. 我在网上看了不少关于A ...
- gRPC学习之五:gRPC-Gateway实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...