AOP相关
AOP相关概念
AOP概述
什么是AOP
AOP:Aspect Oriented Programming,即面向切面编程
它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
AOP的实现方式
使用动态代理技术
AOP的应用
数据库事务管理等
基于XML的AOP配置
环境搭建
第一步:准备客户的业务层和接口(需要增强的类)
package com.fuju.service.impl;
import com.fuju.service.ICustomerService;
public class CustomerServiceImpl implements ICustomerService{
@Override
public void saveCustomer() {
System.out.println("保存了客户");
}
@Override
public void updateCustomer(int i) {
System.out.println("更新了客户"+i);
}
@Override
public int deleteCustomer() {
System.out.println("删除客户");
return 0;
}
}
第二步:准备jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fuju.spring</groupId>
<artifactId>SpringAOP</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringAOP</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 添加日志框架log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 添加spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<!-- 添加aop依赖,用来支持事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
</dependencies>
</project>
第三步:创建spring配置文件并导入约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
</beans>
第四步:把客户的业务层配置到spring容器中
<!-- 配置service -->
<bean id="customerService" class="com.fuju.service.impl.CustomerServiceImpl"></bean>
第五步:制作通知增强的类
public class Logger {
/**
* 记录日志的操作
*/
public void printLog() {
System.out.println("开始记录日志。。。。。");
}
}
配置步骤
1. 把通知类用bean标签配置起来
<!-- 基于xml的aop配置buzhou -->
<bean id="logger" class="com.fuju.utils.Logger"></bean>
2. 使用aop:config声明aop配置
<aop:config>
<!-- 配置切面 :此标签要出现在aop:config内部
id:给切面提供一个唯一标识
ref:引用的是通知类的bean的id
-->
<aop:aspect id="logAdvice" ref="logger">
<!-- 用于配置前置通知:指定增强的方法在切入点方法之前执行
method:用于指定通知类中的增强方法名称
ponitcut-ref:用于指定切入点的表达式的引用
-->
<aop:before method="printLog" pointcut="execution(* *..*.*(..))"/>
</aop:aspect>
</aop:config>
3.切入点表达式说明
execution:
-
匹配方法的执行(常用)
-
execution(表达式)
-
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
-
写法说明:
- 全匹配方式:
public void com.itheima.service.impl.CustomerServiceImpl.saveCustomer() - 访问修饰符可以省略
void com.itheima.service.impl.CustomerServiceImpl.saveCustomer() - 返回值可以使用*号,表示任意返回值
- com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
- 包名可以使用号,表示任意包,但是有几级包,需要写几个
- ....CustomerServiceImpl.saveCustomer()
使用…来表示当前包,及其子包 - com…CustomerServiceImpl.saveCustomer()
类名可以使用*号,表示任意类 - com….saveCustomer()
方法名可以使用号,表示任意方法 - com….()
参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数 - com….(*)
参数列表可以使用…表示有无参数均可,有参数可以是任意类型
- ....CustomerServiceImpl.saveCustomer()
* com..*.*(..)
全通配方式: * ….*(…)
- 全匹配方式: