1.什么是AOP
Aspect Oriented Programming 面向切面编程
可以在不修改源代码的情况 对原有的组件 增加功能
OOP Object Orientied Programming 面向对象编程
面向对象的核心是 对象 面向切面的核心是切面 是对面向对象的扩展
2.Spring AOP 中核心组件
##Aspect 共通的业务逻辑 可以把这个逻辑功能切入到多个对象的方法上
Join Point 连接点 表达一个位置 这个位置上要加切面功能
##Pointcut 切入点 一堆连接的点的集合 后面会讲使用表达式把切点表达出来
Target 目标对象
Proxy 代理 AutoProxy 自动生成的代理
java jdk 的代理 和 CGLIB 的代理
##Advice 通知
方法的切入时机 add update get
时机 调用之前 调用之后 调用前后 抛出异常 最终执行
3.在service 的方法执行之前 切入一个输入 横线的功能
3.1 建立一个 Spring 的项目 拷贝 配置文件 和 jar包(ioc 和 aop )
3.2 建立一个service 类 和 切面类
3.3 在配置文件中 启动组件扫描
把Service 对象 注入到 Spring 容器
4.切入点表达式的写法
within 类型限定表达式
com.xdl.service 这个包下所有类型 不包括子包
expression = "within(com.xdl.service.*)"
com.xdl.service 这个包直接子包下的类型
expression = "within(com.xdl.service.*.*)"
com.xdl.service 这个包和子包下的类型
expression = "within(com.xdl.service..*)"
com.xdl.service 这个包下所有类型 包括直接子包 和 非直接子包
expression = "within(com..*.*)"
execution 方法限定表达式
expression = "execution([修饰权限] 返回值 方法名(参数列表) [异常抛出])"
com.xdl.service.EmpService 这个类中 所有的以 log开头的方法
expression = "execution(void com.xdl.service.EmpService.log*())"
程序中 所有的 以 add开头的方法
expression = "execution(* add*())"
程序中 com.xdl 包 及子包 所有的 以 add开头的方法
expression = "execution(* com.xdl..*.add*())"
bean 限定表达式
以spring 容器中bean 的 id 作为限定标准
experession = "bean(emp*)"
5.Spring AOP 通知的五种类型
<aop:before> 前置通知 业务方法调用之前执行
<aop:after-returning> 后置通知 业务方法不抛异常 业务执行之后执行
如果业务方法抛异常 则不执行
<aop:after> 最终通知 业务方法 无论是否抛异常 最终都会执行
<aop:after-throwing> 异常通知 业务方法抛出异常之后 执行
<aop:around> 环绕通知 业务方法之前和之后 都执行
6.基于标注的 aop
6.1 拷贝 ioc 和 aop 的jar 包到项目下
6.2 拷贝spring 的配置文件
先开启组件扫描 再开启基于标注的 aop
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.xdl" ></context:component-scan>
<!-- 开启基于标注的aop -->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>
6.3 写一个Service 的类 BankService
里面有 一个业务方法 transfter login
6.4 写一个切面类出来
里面写一些共通的处理代码
@Component
@Aspect
在切面方法上 加 @Before("切点表达式") @After 等标注
6.5 测试
最后总结一句话 就是 切面 ---- 通知 ----- 切点
Aspect Oriented Programming 面向切面编程
可以在不修改源代码的情况 对原有的组件 增加功能
OOP Object Orientied Programming 面向对象编程
面向对象的核心是 对象 面向切面的核心是切面 是对面向对象的扩展
2.Spring AOP 中核心组件
##Aspect 共通的业务逻辑 可以把这个逻辑功能切入到多个对象的方法上
Join Point 连接点 表达一个位置 这个位置上要加切面功能
##Pointcut 切入点 一堆连接的点的集合 后面会讲使用表达式把切点表达出来
Target 目标对象
Proxy 代理 AutoProxy 自动生成的代理
java jdk 的代理 和 CGLIB 的代理
##Advice 通知
方法的切入时机 add update get
时机 调用之前 调用之后 调用前后 抛出异常 最终执行
3.在service 的方法执行之前 切入一个输入 横线的功能
3.1 建立一个 Spring 的项目 拷贝 配置文件 和 jar包(ioc 和 aop )
3.2 建立一个service 类 和 切面类
3.3 在配置文件中 启动组件扫描
把Service 对象 注入到 Spring 容器
4.切入点表达式的写法
within 类型限定表达式
com.xdl.service 这个包下所有类型 不包括子包
expression = "within(com.xdl.service.*)"
com.xdl.service 这个包直接子包下的类型
expression = "within(com.xdl.service.*.*)"
com.xdl.service 这个包和子包下的类型
expression = "within(com.xdl.service..*)"
com.xdl.service 这个包下所有类型 包括直接子包 和 非直接子包
expression = "within(com..*.*)"
execution 方法限定表达式
expression = "execution([修饰权限] 返回值 方法名(参数列表) [异常抛出])"
com.xdl.service.EmpService 这个类中 所有的以 log开头的方法
expression = "execution(void com.xdl.service.EmpService.log*())"
程序中 所有的 以 add开头的方法
expression = "execution(* add*())"
程序中 com.xdl 包 及子包 所有的 以 add开头的方法
expression = "execution(* com.xdl..*.add*())"
bean 限定表达式
以spring 容器中bean 的 id 作为限定标准
experession = "bean(emp*)"
5.Spring AOP 通知的五种类型
<aop:before> 前置通知 业务方法调用之前执行
<aop:after-returning> 后置通知 业务方法不抛异常 业务执行之后执行
如果业务方法抛异常 则不执行
<aop:after> 最终通知 业务方法 无论是否抛异常 最终都会执行
<aop:after-throwing> 异常通知 业务方法抛出异常之后 执行
<aop:around> 环绕通知 业务方法之前和之后 都执行
6.基于标注的 aop
6.1 拷贝 ioc 和 aop 的jar 包到项目下
6.2 拷贝spring 的配置文件
先开启组件扫描 再开启基于标注的 aop
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.xdl" ></context:component-scan>
<!-- 开启基于标注的aop -->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>
6.3 写一个Service 的类 BankService
里面有 一个业务方法 transfter login
6.4 写一个切面类出来
里面写一些共通的处理代码
@Component
@Aspect
在切面方法上 加 @Before("切点表达式") @After 等标注
6.5 测试
最后总结一句话 就是 切面 ---- 通知 ----- 切点