spring 多個切面如何有序執行

  Spring也能支持多個切面。當有多個切面時,它不會存在任何順序,這些順序代碼會隨機生成,可是有時候咱們但願它按照指定的順序運行。
  在此以前要先定義一個切點方法,爲此新建一個接口——MultiBeanspring

  代碼清單:定義多個切面的切點方法ide

package com.ssm.chapter11.multi.bean;

public interface MultiBean {

    public void testMulti();

}

 


  代碼清單:實現MultiBean接口測試

package com.ssm.chapter11.multi.bean.impl;

import com.ssm.chapter11.multi.bean.MultiBean;
import org.springframework.stereotype.Component;

/****************imports****************/
@Component
public class MultiBeanImpl implements MultiBean {

    // @Override
    public void testMulti() {
        System.out.println("test multi aspects!!");
    }

}

 


  代碼清單:3個切面spa

package com.ssm.chapter11.multi.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;


/**************** imports ****************/
@Aspect
// @Order(1)
public class Aspect1 implements Ordered {

    // @Override
    public int getOrder() {
        return 1;
    }

    @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
    public void print() {
    }

    @Before("print()")
    public void before() {
        System.out.println("before 1 ......");
    }

    @After("print()")
    public void after() {
        System.out.println("after 1 ......");
    }

    @AfterThrowing("print()")
    public void afterThrowing() {
        System.out.println("afterThrowing 1 ......");
    }

    @AfterReturning("print()")
    public void afterReturning() {
        System.out.println("afterReturning 1 ......");
    }

}
package com.ssm.chapter11.multi.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;

/**************** imports ****************/
@Aspect
@Order(2)
public class Aspect2 {
    @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
    public void print() {
    }

    @Before("print()")
    public void before() {
        System.out.println("before 2 ......");
    }

    @After("print()")
    public void after() {
        System.out.println("after 2 ......");
    }

    @AfterThrowing("print()")
    public void afterThrowing() {
        System.out.println("afterThrowing 2 ......");
    }

    @AfterReturning("print()")
    public void afterReturning() {
        System.out.println("afterReturning 2 ......");
    }
}
package com.ssm.chapter11.multi.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;

/**************** imports ****************/
@Aspect
@Order(3)
public class Aspect3 {
    @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
    public void print() {
    }

    @Before("print()")
    public void before() {
        System.out.println("before 3 ......");
    }

    @After("print()")
    public void after() {
        System.out.println("after 3 ......");
    }

    @AfterThrowing("print()")
    public void afterThrowing() {
        System.out.println("afterThrowing 3 ......");
    }

    @AfterReturning("print()")
    public void afterReturning() {
        System.out.println("afterReturning 3 ......");
    }
}

 


  代碼清單:多切面測試Java配置code

package com.ssm.chapter11.multi.config;

import com.ssm.chapter11.multi.aspect.Aspect1;
import com.ssm.chapter11.multi.aspect.Aspect2;
import com.ssm.chapter11.multi.aspect.Aspect3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/****************imports****************/
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.ssm.chapter11.multi")
public class MultiConfig {
    @Bean
    public Aspect1 getAspect1() {
        return new Aspect1();
    }

    @Bean
    public Aspect2 getAspect2() {
        return new Aspect2();
    }

    @Bean
    public Aspect3 getAspect3() {
        return new Aspect3();
    }
}

 

  代碼清單:測試blog

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(MultiConfig.class);
        MultiBean multiBeanService = ctx.getBean(MultiBean.class);

        multiBeanService.testMulti();

    }

 

 

如何讓它有序執行:
1.@Order(1),@Order(2),@Order(3) 註解
2.實現 implements Ordered
3.<aop:aspect ref="aspect1" order="1"> 接口

相關文章
相關標籤/搜索