Spring第五章 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….(*)
        参数列表可以使用…表示有无参数均可,有参数可以是任意类型
    * com..*.*(..)
    

    全通配方式: * .*(…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值