一起学Spring之AOP
概述在软件开发中,我们重点关注的是业务逻辑代码,但在实际开发中,需要写的代码却不仅仅是业务逻辑,还需要处理记录日志,异常处理,事务控制等一些与业务无关的事情。而且这些代码也是服务端必须的,类似这样的代码分散在系统中的各个地方,如:几乎所有的重要操作方法前面都会加上日志记录代码,这样的代码写起来繁琐,又占用开发时间和精力,而且不容易维护。我们统一把这类代码成为【切面代码】,如何让我们从这些繁琐的工作中抽身而退,更加专注于业务逻辑,这就需要用到Spring的AOP技术。 AOP原理:将复杂的需求分解成不同的方面,将散落在系统中的公共功能集中解决,如下图所示: 通知(Advice)的分类分类如下:
准备工作AOP需要的jar包除Spring必备的五个jar包外,还需要以下三个来支撑AOP:
定义一个接口和实现类如下所示: IStudentService接口 代码如下: 1 package com.hex.second; 2 3 /** 4 * 学生服务接口 5 * @author Administrator 6 * 7 */ 8 public interface IStudentService { 9 10 11 * 新增学生 12 * @param student 13 14 void addStudent(Student student); 15 16 * 删除学生 17 id 18 19 void deleteStudent(int id); 20 21 22 * 修改学生 23 24 25 void updateStudent(26 } StudentServiceImpl类 代码如下: * 学生服务事项类 class StudentServiceImpl implements 9 12 13 addStudent(Student student) { 14 // TODO Auto-generated method stub 15 System.out.println("新增加学生。。。"); } 17 18 19 20 21 @Override 22 id) { 23 24 System.out.println("删除学生。。。"25 26 27 28 29 30 31 32 System.out.println("修改学生"33 int i=1/0; 34 35 } 前置通知1. 实现接口前置通知类,需要实现【MethodBeforeAdvice】接口中的before方法,如下所示: Method method 表示执行的目标方法 Object[] args 表示传入的参数数组 Object target 表示目标对象,即切入点所示的对象 import java.lang.reflect.Method; 4 org.springframework.aop.MethodBeforeAdvice; 6 7 class LogBefore MethodBeforeAdvice { 8 9 /*** 10 * 前置通知 * method:表示调用的方法,即切入点 * args:表示调用方法的参数 13 * target:表示方法所在的目标对象 14 15 16 void before(Method method,Object[] args,Object target) throws Throwable { 17 18 System.out.println("前置通知。。。"19 System.out.println("method="+method+",args数量="+args.length+",target="+target); 20 21 } 2. 配置applicationContext.xml文件如果要支持AOP,需要引入命名空间,如下所示: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop 9 http://www.springframework.org/schema/aop/spring-aop.xsd"> 3. 配置两个类对应的bean<!-- 服务类 --> bean id="studentService" class="com.hex.second.StudentServiceImpl"></bean> 3 前置通知类 4 ="logBefore"="com.hex.second.LogBefore"4. 配置AOP |