Spring的使用(四):註解式AOP

步驟

  1. 切面配置進入容器
  2. 指定切面(切面添加@Aspect註解)
  3. 配置切入點
    a.攔截類 bean(xxx) 在容器中命名爲xxx的類中所有方法都會被切入
    b.攔截方法 execution(* com.service.ProServiceImpl.*(…)) 【具體的位置可以用*代替,代表任意的意思】
  4. 配置通知 給指定的通知增加響應的註解

    配置通知的切入點
        a.直接配置切入規則 在註解的括號中使用value來指定規則
        b.引入切入點 引入之前配置好的切入點 引用的切入點是帶pointcut註解的方法

  5. 打開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();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章