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 的 ...
随机推荐
- 第三篇 -- HTML基础
买的课程学习 Web 前端标准 web前端技术指的不是某一项技术,而是一系列技术的集合,主要包括: html -- 结构标准:负责网页结构的搭建 css -- 样式标准/表现标准:负责网页的美化工作 ...
- Python脚本:批量将.doc文件转化为.docx文件
将.doc转换为.docx文件有几种常用的方法: Microsoft Word 和 WPS 自带.doc转换.docx功能,但只能一个文件一个文件转换,批量转换要会员 在线网页 Office-Conv ...
- (python函数01)enumerate函数
enumerate函数 enumerate函数示例代码01运行结果01示例代码02运行结果02 enumerate(枚举,列举)是python的内置函数,enumerate的参数为可迭代对象,如字符串 ...
- Android 帧动画使用
帧动画 使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画.也可以比喻为像一卷胶卷一样按顺序播放. 播放起来,有点像在看gif图. 本文介绍使用AnimationD ...
- DC-9 靶机渗透测试
DC-9 渗透测试 冲冲冲,好好学习 DC系列的9个靶机做完了,对渗透流程基本掌握,但是实战中出现的情况千千万万,需要用到的知识面太广了,学不可以已. 靶机IP: 172.66.66.139 kali ...
- 04.委托Delegation
1. 基本了解 1.1 委托简述 官方文档 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用,用于将方法作为参数传递给其他方法,可将任何可访问类或结构中与委托类型匹配的任何方法分配给委 ...
- IPSec组播概要
IPSec作为主流IP安全协议之一,在单播环境下,特别是在VPN场景中应用广泛.但是在组播环境貌似看到的不多,通过RFC4301了解到IPSec首先是支持组播的,即通过手动配置的方式可以实现组播包加密 ...
- Java面向对象14——接口
接口 package oop.demon01.demon09; //抽象思维~Java //interface 定义的关键字 , 接口都需要有实现类 public interface Use ...
- CCS box-flex属性
box-flex==按比例分配父标签的宽度or高度空间 1.非固定分配 eg.一块地总150平方分配给三孩子,按照2:1:1分 #老大 { 房子-分配: 2; } = 75平 #老二 { 房子-分配: ...
- Javac 编译器
编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法 ...