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 的 ...
随机推荐
- jenkens安装教程
war包安装方式(linux和windows下) 具体参见:https://www.cnblogs.com/UncleYong/p/10742867.html
- webpack 安装使用简例
1. 新建项目文件夹,如 webpack-demo 2. cd 到安装项目根目录,即进入webpack-demo文件夹,命令行工具输入"npm install webpack webpack ...
- 规模化敏捷LeSS(二):LeSS*队实践指南
Scrum 能够帮助一个5-9人的小*队以迭代增量的方式开发产品,在每一迭代结束时,交付潜在的可交付的产品增量.正是由于其灵活性,Scrum 方法现已成为*队软件交付方法的首选,近期发布的15届敏捷状 ...
- 从零开始的Java RASP实现(一)
目录 0 从零开始的Java RASP实现(一) 1 javaagent 1.1 Main方法启动前 概念介绍: 如何使用 创建agent 创建main 1.2 JVM启动后 attach机制 启动一 ...
- Codeforces Round #735 (Div. 2) 题解
比赛地址:https://codeforces.com/contest/1554. 只有 ABCD 的题解,E 不会. A 答案是 \(\max_i\{a_ia_{i+1}\}\).证明:(反证)如果 ...
- [编译] 8、在Linux下搭建 stm8 单片机的开发烧写环境(makefile版)
目录 一.SDCC(Small Device C Compiler)编译环境搭建 1.1.下载 1.2.编译 1.3.测试 二.Hex2Bin+命令行烧写工具配置使用 2.1.下载工具安装配置 2.2 ...
- 🔥 LeetCode 热题 HOT 100(81-90)
337. 打家劫舍 III 思路:后序遍历 + 动态规划 推荐题解:树形 dp 入门问题(理解「无后效性」和「后序遍历」) /** * Definition for a binary tree nod ...
- 单片机学习(一)项目的建立和vscode代码编辑环境的设置
目录 Keil项目的建立 使用vscode进行开发 工欲善其事必先利其器,因此我们先搭建一个比较舒服的开发环境. Keil项目的建立 打开Keil软件点击Project/New uVision Pro ...
- HCNA Routing&Switching之STP选举规则
前文我们了解了二层环路对网络带来的影响,以及STP工作流程和BPDU数据包结构和相关字段的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15121317. ...
- Linux中的DNS的正解析
目录 一.DNS概述 1.1.DNS定义 1.2.域名结构 1.3.DNS域名解析的方式 1.4.DNS服务器类型 1.5.BIND服务 BIND服务器端程序 二.构建DNS域名正向解析步骤 一.DN ...