为了账号安全,请及时绑定邮箱和手机立即绑定

探秘Spring AOP

apollo JAVA开发工程师
难度高级
时长 2小时30分
学习人数
综合评分9.67
84人评价 查看评价
9.9 内容实用
9.4 简洁易懂
9.7 逻辑清晰
  • @Before方法执行前的
    查看全部
    0 采集 收起 来源:advice注解

    2019-10-22

  • Advice的5种注解

    @Before:前置通知

    @After(finally):后置通知,方法执行完之后

    @AfterReturning:返回通知,成功执行之后

    @AfterThrowing:异常通知,抛出异常之后

    @Around:环绕通知


    查看全部
    0 采集 收起 来源:advice注解

    2019-10-22

  • 第四步:演示测试结果:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ExecutionDemoApplicationTests {

        @Autowired
        ProductService productService;

        @Autowired
        SubService subService;

        @Autowired
        LogService logService;

        @Test
        public void test() {
            System.out.println("###begin test###");
            productService.findById(1L);
            productService.findByTwoArgs(1L,"hello");
            productService.getName();
            subService.demo();
            try {
                productService.exDemo();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

    }


    查看全部
    0 采集 收起 来源:execution表达式

    2019-10-22

  • 第一步:需要添加的依赖:

    aop

    test

    查看全部
    0 采集 收起 来源:execution表达式

    2019-10-22

  • 第二步:子包下的service

    SubService:

    @Component
    public class SubService extends ProductService{

        public void demo(){
            System.out.println("execute sub service method");
        }
    }

    查看全部
    0 采集 收起 来源:execution表达式

    2019-10-22

  • 第三步:

    /**
     * //匹配任何公共方法
     @Pointcut("execution(public * com.imooc.service.*.*(..))")

     //匹配com.imooc包及子包下Service类中无参方法
     @Pointcut("execution(* com.imooc..*Service.*())")

     //匹配com.imooc包及子包下Service类中的任何只有一个参数的方法
     @Pointcut("execution(* com.imooc..*Service.*(*))")

     //匹配com.imooc包及子包下任何类的任何方法
     @Pointcut("execution(* com.imooc..*.*(..))")

     //匹配com.imooc包及子包下返回值为String的任何方法
     @Pointcut("execution(String com.imooc..*.*(..))")

     //匹配异常
     execution(public * com.imooc.service.*.*(..) throws java.lang.IllegalAccessException)

     * Created by cat on 2017-02-19.
     */
    @Aspect
    @Component
    public class ExecutionAspectConfig {

     @Pointcut("execution(public * com.imooc.service..*Service.*(..) throws java.lang.IllegalAccessException)")
     public void matchCondition(){}

     @Before("matchCondition()")//before代表要执行插入的逻辑
     public void before(){
      System.out.println("");
      System.out.println("###before");
     }

    }

    查看全部
    1 采集 收起 来源:execution表达式

    2019-10-22

  • execution表达式

    execution(<修改符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)格式

    除了返回类型模式、方法名模式和参数模式外,其它项都是可选的


    查看全部
    0 采集 收起 来源:execution表达式

    2019-10-22

  • @within和@target两个注解可在被标注类的继承子类所继承

    public class AnnoAspectConfig {


        @Pointcut("@within(com.imooc.anno.NeedSecured) && within(com.imooc..*)")

    //  @Pointcut("@target(com.imooc.anno.NeedSecured) && within(com.imooc..*)")

        public void matchAnno(){}


        @Before("matchAnno()")
        public void before(){
            System.out.println("");
            System.out.println("###before");
        }
    }
    查看全部
    0 采集 收起 来源:注解匹配

    2019-10-22

  • 匹配注解

    //匹配方法标注有AdminOnly的注解的方法

    @Pointcut("@annotation(com.imooc.demo.security.AdminOnly)")

    public void annoDemo(){}


    //匹配标注有Beta的类底下的方法,要求的annotation的RetentionPolicy级别为CLASS

    @Pointcut("@within(com.google.common.annotations.Beta)")

    public void annoWithinDemo(){}


    //匹配标注有Repository的类底下的方法,要求的annotation的RetentionPolicy级别为RUNTIME

    @Pointcut("@target(org.springframework.stereotype.Repository)")

    public void annoTargetDemo(){}


    //匹配传入的参数类标注有Repository注解的方法

    @Pointcut("@args(org.springframework.stereotype.Repository)")

    public void annoArgsDemo(){}

    查看全部
    0 采集 收起 来源:注解匹配

    2019-10-22

  • public class AnnoAspectConfig {

        @Pointcut("@annotation(com.imooc.anno.AdminOnly)
        public void matchAnno(){}

       @Before("matchAnno()")
        public void before(){
            System.out.println("");
            System.out.println("###before");
        }

    }



    /**
     * * Created by cat on 2017-02-19.

       在被拦截类上添加方法上添加@AdminOnly注解

    */
    @Component
    public class LogService implements Loggable{
        @Override
        @AdminOnly
        public void log() {
            System.out.println("log from LogService");
        }

        public void annoArg(Product product){
            System.out.println("execute log service annoArg");
        }
    }


    查看全部
    0 采集 收起 来源:注解匹配

    2019-10-22

  • 匹配注解:

    查看全部
    0 采集 收起 来源:注解匹配

    2019-10-22

  • 匹配参数

    //匹配任何以find开头而且只有一个Long参数的方法

    @Pointcut("execution(* *..find*(Long))"){}

    public void demo1(){}

    /**
     * //匹配任何以find开头而且只有一个Long参数的方法
     * @Pointcut("execution(* *..find*(Long))")
     * //匹配任何以find开头的而且第一个参数为Long型的方法
     * @Pointcut("execution(* *..find*(Long,..))")
     * //匹配任何只有一个Long参数的方法
     * @Pointcut("within(com.imooc..*) && args(Long)")
     * //匹配第一个参数为Long型的方法
     * @Pointcut("within(com.imooc..*) && args(Long,..)")
     * Created by cat on 2016-12-04.
     */
    @Aspect
    @Component
    public class ArgsAspectConfig {
        @Pointcut("args(Long,String) && within(com.imooc.service.*)")
        public void matchArgs(){}

        @Before("matchArgs()")
        public void before(){
            System.out.println("");
            System.out.println("###before");
        }
    }

    查看全部
    0 采集 收起 来源:参数匹配

    2019-10-22

  • 匹配参数:<br/>
    查看全部
    0 采集 收起 来源:参数匹配

    2020-09-11

  • /**
     * //匹配AOP对象的目标对象为指定类型的方法,即LogService的aop代理对象的方法
     * @Pointcut("this(com.imooc.log.Loggable)")
     * //匹配实现Loggable接口的目标对象(而不是aop代理后的对象)的方法
     * @Pointcut("target(com.imooc.log.Loggable)")
     * //this 可以拦截 DeclareParents(Introduction)
     * //target 不拦截 DeclareParents(Introduction)
     * //匹配所有以Service结尾的bean里头的方法
     * @Pointcut("bean(*Service)")
     * Created by cat on 2016-12-04.
     */
    @Aspect
    @Component
    public class ObjectAspectConfig {

        @Pointcut("bean(logService)")
        public void matchCondition(){}

        @Before("matchCondition()")
        public void before(){
            System.out.println("");
            System.out.println("###before");
        }
    }

    查看全部
    0 采集 收起 来源:对象匹配

    2019-10-22

  • 匹配对象:

    1:this(包名):匹配AOP对象的目标对象指定类型的方法;

    2:target(包名):匹配实现接口的目标对象的方法(不是AOP代理后的对象);

    3:bean(包名):匹配所有以Service结尾的bean里头的方法;

    查看全部
    0 采集 收起 来源:对象匹配

    2019-10-22

举报

0/150
提交
取消
课程须知
本课程有一定的难度,需要同学较为熟练的掌握Spring和Spring Boot相关知识。熟练配置mysql,mongodb和maven项目。本课程将带领大家对源码进行刨析!不熟悉相关内容的同学可先学习SSM免费路径上的课程和慕课网上Spring Boot的基础课(http://www.imooc.com/learn/767)。
老师告诉你能学到什么?
让学生了解SpringAop的原理,使用,解读SpirngAop的经典代码,再通过案例加深让学生对SpirngAop的理解和掌握的程度

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!