注解方式实现AOP(使用注解必须开启组件扫描);切点表达式抽取(@Pointcut)

一、注解实现AOP

1、创建接口类、目标类、切面类

2、将目标类、切面类的对象创建权交给 Spring

      @Component

3、切面类中使用注解配置织入关系

      @Aspect

 

1、2、3 代码如下:

package com.lt.anno;

// 创建接口类
public interface TargetInterface {
    void save();
}
package com.lt.anno;

import org.springframework.stereotype.Component;

// 目标类
@Component("target") //将对象创建交给 Spring
public class Target implements TargetInterface {
    @Override
    public void save() {
        System.out.println("save running");
        //int i=1/0;
    }
}
package com.lt.anno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

// 切面类
@Component("myAspct") //将对象创建交给 Spring
@Aspect //切面类
public class MyAspect {
    //@Before("execution(* com.lt.anno.*.*(..))")
    public void  before(){
        System.out.println("前置增强。。。");
    }

    public  void afterReturning(){
        System.out.println("后置增强。。。");
    }

    //Proceeding JoinPoint 正在执行的连接点 = 切点
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("前置增强。");
        Object proceed= pjp.proceed(); //切点方法
        System.out.println("后置增强。");
        return proceed;
    }

    public  void afterThrowing(){
        System.out.println("异常抛出增强。");
    }

    @After("MyAspect.pointcut()")
    public  void after(){
        System.out.println("最终增强。");
    }


    @Pointcut("execution(* com.lt.anno.*.*(..))")
    public  void pointcut(){}
}

4、配置文件中开启组件扫描 和 AOP自动代理

命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"

约束路径

http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context.xsd

代码如下:




5、测试

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationcontext-anno.xml")
public class annoTest {
    @Autowired
    private TargetInterface target;

    @Test
    public  void  Test1(){
        target.save();
    }
}

注意:在Spring中使用测试,需要导入 junit、spring-test(版本需要和spring-context版本一致) 坐标

你可能感兴趣的:(Java)