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 的 ...
随机推荐
- C语言学习(三)
一.数组.循环.判断条件 #include<stdio.h> int main(){ int a =100; int b =200; int i; int arr [5]; if (a ...
- 第八篇--编写Windows服务
编写service服务参考网址:https://blog.csdn.net/nodeathphoenix/article/details/24181509 vc获得显示器状态(捕获息屏.亮屏网址):h ...
- 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."
API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...
- (Opencv02)图片展示
(Opencv02)图片展示 在程序里我们怎么把图片显示出来呢? 这里需要记一个自定义函数就好啦! def cv_show(name, img): cv2.imshow(name, img) ...
- videojs文档翻译-api
直播流地址 rtmp://live.hkstv.hk.lxdns.com/live/hks API 接口 (一) Modules 模块 1) browser :浏览器 2) ...
- 大数据学习(08)—— Hive简介
前面的Hadoop学习是非常体系化的,有主线有细节.到了Hive这里,知识点非常零散,感觉没有什么主线能把它串起来.从官方网站上就能看出这点差异. 什么是Hive Hive是一个基于Hadoop的企业 ...
- 什么是软件的CLI安装
Websoft9 在进行开源软件的集成与自动化安装研究过程中发现有些软件有CLI安装模式,例如Gitlab CLI版本.Ghost CLI.PHP CLI等,CLI安装是什么意思? CLI(Comma ...
- Blazor 路由及导航开发指南
翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...
- 三层交换机和VLAN
目录 一.VLAN的概述及优势 二.VLAN的种类 三.静态VLAN的配置 四.Trunk介绍与配置 五.三层交换机转发原理 一.VLAN的概述及优势 分割广播域 物理分割 逻辑分割 VLAN的优势: ...
- DHCP\PXE+kickstart网络装机平台
DHCP概述及原理: DHCP地址分配的四次会话 DISCOVERY -****OFFER -REQUEST -ACK 服务端基本概念: 租期:允许客户机组用IP地址的时间期限,单位为秒 作用 ...