Spring——面向切面编程AOP

Posted IT大玩客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——面向切面编程AOP相关的知识,希望对你有一定的参考价值。

除了采用xml方式配置aop外,我们还可以使用注解来配置aop,下面我们来看看基于注解的AOP配置方式。

启用@AsjectJ支持

在bean的配置文件中,添加以下:

<aop:aspectj-autoproxy />

通知类型(5种)

(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可

(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象

(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式

(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

举个栗子

要求:为员工的业务接口添加日志跟踪的功能
1.创建接口EmployeeService

package com.hzit.service;
public interface EmployeeService {
   public void save();
   public void update();
   public void delete();
   public void query();
}

2.创建接口实现类EmployeeServiceImpl

package com.hzit.service;
public class EmployeeServiceImpl implements EmployeeService {
   @Override
   public void save() {
       System.out.println("执行员工信息保存...");
   }
   @Override
   public void update() {
       System.out.println("执行员工信息更新...");
   }
   @Override
   public void delete() {
       System.out.println("执行员工信息删除...");
   }
   @Override
   public void query() {
       System.out.println("执行员工信息查询...");
   }
}

3.创建切面类LogggingService

package com.hzit.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* 切面类
*
* @author 无言
*
*/

@Component
@Aspect
public class LoggingService {
   @Pointcut("execution(* com.hzit.service..*.*(..))")
   public void pointCut() {
   }
   @Before("pointCut()")
   public void doBefore(JoinPoint joinPoint) {
       System.out.println("AOP Before Advice...");
   }
   @After("pointCut()")
   public void doAfter(JoinPoint joinPoint) {
       System.out.println("AOP After Advice...");
   }
   @AfterReturning(pointcut = "pointCut()", returning = "returnVal")
   public void afterReturn(JoinPoint joinPoint, Object returnVal) {
       System.out.println("AOP AfterReturning Advice:" + returnVal);
   }
   @AfterThrowing(pointcut = "pointCut()", throwing = "error")
   public void afterThrowing(JoinPoint joinPoint, Throwable error) {
       System.out.println("AOP AfterThrowing Advice..." + error);
       System.out.println("AfterThrowing...");
   }
   @Around("pointCut()")
   public void around(ProceedingJoinPoint pjp) {
       System.out.println("AOP Aronud before...");
       try {
           pjp.proceed();
       } catch (Throwable e) {
           e.printStackTrace();
       }
       System.out.println("AOP Aronud after...");
   }
}

4.bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
>

   <context:component-scan base-package="com.hzit.service,com.hzit.aop"></context:component-scan>
   <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

5.测试类

package com.hzit.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hzit.service.EmployeeService;
public class Test {
   public static void main(String[] args) {
       ApplicationContext aContext = new ClassPathXmlApplicationContext("com/hzit/aop/beans.xml");
       EmployeeService bean = aContext.getBean("employeeService",EmployeeService.class);
       bean.save();
   }
}

6.执行结果:


以上是关于Spring——面向切面编程AOP的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架深入--AOP面向切面

Spring的AOP面向切面编程

Spring的AOP面向切面编程

spring-AOP(面向切面编程)

Spring-AOP(面向切面编程)

Spring AOP面向切面编程详解