1 AspectJ 介绍
- AspectJ是一个基于Java语言的AOP框架
- Spring2.0以后新增了对AspectJ切点表达式支持
- @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面
- 新版本Spring框架,建议使用AspectJ方式来开发AOP
- 主要用途:自定义开发
2 AspectJ 通知类型
- aop联盟定义通知类型,具有特性接口,必须实现,从而确定方法名称;
- aspectj 通知类型,只定义类型名称,以及方法格式;一共6种
before
:前置通知(应用:各种校验),在方法执行前执行,如果通知抛出异常,阻止方法运行;afterReturning
:后置通知(应用:常规数据处理),方法正常返回后执行,如果方法中抛出异常,通知无法执行,必须在方法执行后才执行,所以可以获得方法的返回值;around
:环绕通知(应用:十分强大,可以做任何事情),方法执行前后分别执行,可以阻止方法的执行,必须手动执行目标方法;afterThrowing
:抛出异常通知(应用:包装异常信息),方法抛出异常后执行,如果方法没有抛出异常,无法执行;after
:最终通知(应用:清理现场),方法执行完毕后执行,无论方法中是否出现异常;
3 AspectJ 测试
- 导入 jar 包
- 实现类和切面类
package com.tzb.service;
public class UserServiceImpl implements IUserService {
@Override
public void addUser() {
System.out.println("添加用户。。。");
}
@Override
public void updateUser() {
System.out.println("更新用户。。。");
}
@Override
public void delete() {
System.out.println("删除用户。。。");
}
}
package com.tzb.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect3 {
public void myBefore() {
System.out.println("前置通知...");
}
public void myAfterRetrunning(){
System.out.println("后置通知...");
}
public Object myArround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕通知...");
System.out.println(pjp.getSignature().getName());
System.out.println("开启事务..");
Object retObj = pjp.proceed();
System.out.println("结束事务..");
return retObj;
}
}
beans.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class="com.tzb.service.UserServiceImpl"/>
<bean id="myAspect3" class="com.tzb.aspect.MyAspect3"/>
<aop:config>
<aop:aspect ref="myAspect3">
<aop:pointcut id="myPointcut" expression="execution(* com.tzb.service.UserServiceImpl.*(..))"/>
<aop:around method="myArround" pointcut-ref="myPointcut"></aop:around>
</aop:aspect>
</aop:config>
</beans>
@Test
public void test1() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans10.xml");
IUserService userService = (IUserService) context.getBean("userService");
userService.delete();
}