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的主要内容,如果未能解决你的问题,请参考以下文章