步驟
- 切面配置進入容器
- 指定切面(切面添加@Aspect註解)
- 配置切入點
a.攔截類 bean(xxx) 在容器中命名爲xxx的類中所有方法都會被切入
b.攔截方法 execution(* com.service.ProServiceImpl.*(…)) 【具體的位置可以用*代替,代表任意的意思】 - 配置通知 給指定的通知增加響應的註解
配置通知的切入點
a.直接配置切入規則 在註解的括號中使用value來指定規則
b.引入切入點 引入之前配置好的切入點 引用的切入點是帶pointcut註解的方法 - 打開aop註解式管理 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
示例
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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.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">
<context:component-scan base-package="com.service"></context:component-scan>
<context:component-scan base-package="com.aop"></context:component-scan>
<!--自動打開註解式AOP-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
@Component("myAspect")
@Aspect
public class MyAspect {
/*自定義的切入點*/
@Pointcut(value="bean(*Service)")
public void xxx(){}
@Pointcut(value = "execution(* com.service.ProServiceImpl.pro2(..))")
public void guize(){}
//前置通知
@Before(value = "xxx()")
public void beforeLogin(JoinPoint jointPoint){
//方法名
System.out.println("=============開始進入前置通知===============");
System.out.println("攔截的方法名是===" + jointPoint.getSignature().getName());
System.out.println("目標對象是==="+jointPoint.getTarget().getClass().getName());
System.out.println("代理對象是====" + jointPoint.getThis().getClass().getName());
System.out.println("當前方法的參數" + Arrays.toString(jointPoint.getArgs()));
System.out.println("進入了方法前的時間是" + CommmonUtil.getTime());
System.out.println("=============前置通知結束===============");
}
//後置通知
@AfterReturning(value = "guize()",returning = "returnVal")
public void afterRetuturningLogin(JoinPoint jointPoint,Object returnVal){
System.out.println("=============開始進入後置通知===============");
System.out.println("攔截的方法名是===" + jointPoint.getSignature().getName());
System.out.println("目標對象是==="+jointPoint.getTarget().getClass().getName());
System.out.println("代理對象是====" + jointPoint.getThis().getClass().getName());
System.out.println("當前方法的返回值是" + returnVal);
System.out.println("出方法的時間是" + CommmonUtil.getTime());
System.out.println("=============後置通知結束===============");
}
//環繞通知(本質就是代理原來的方法)
@Around(value = "guize()")
public Object around(ProceedingJoinPoint jointPoint) throws Throwable {
System.out.println("=============開始進入環繞通知===============");
System.out.println("攔截的方法名是===" + jointPoint.getSignature().getName());
System.out.println("目標對象是==="+jointPoint.getTarget().getClass().getName());
System.out.println("代理對象是====" + jointPoint.getThis().getClass().getName());
System.out.println("當前方法的參數" + Arrays.toString(jointPoint.getArgs()));
System.out.println("進入了方法前的時間是" + CommmonUtil.getTime());
Object returnVal = jointPoint.proceed();
System.out.println("當前方法的返回值是" + returnVal);
System.out.println("出方法的時間是" + CommmonUtil.getTime());
System.out.println("=============環繞通知結束===============");
return returnVal;
}
//異常通知
public void afterThrowing(JoinPoint jointPoint,Throwable ex){
System.out.println("=============開始進入異常通知===============");
System.out.println("攔截的方法名是===" + jointPoint.getSignature().getName());
System.out.println("目標對象是==="+jointPoint.getTarget().getClass().getName());
System.out.println("代理對象是====" + jointPoint.getThis().getClass().getName());
System.out.println("異常信息爲=====" + ex.getMessage());
System.out.println("異常時間是" + CommmonUtil.getTime());
System.out.println("=============異常通知結束===============");
}
//異常通知
public void after(JoinPoint jointPoint){
System.out.println("=============開始進入最終通知===============");
System.out.println("攔截的方法名是===" + jointPoint.getSignature().getName());
System.out.println("目標對象是==="+jointPoint.getTarget().getClass().getName());
System.out.println("代理對象是====" + jointPoint.getThis().getClass().getName());
System.out.println("最終的時間是" + CommmonUtil.getTime());
System.out.println("=============最終結束===============");
}
}
@Service("proService")
public class ProServiceImpl implements IProService {
@Override
public void pro1() {
System.out.println("pro1執行了");
}
@Override
public void pro2() {
System.out.println("pro2執行了");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestAop {
@Resource(name="userService")
private IUserService service;
@Resource(name="proService")
private IProService proService;
@Test
public void test1(){
proService.pro2();
}
}