spring切面Aspects

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring切面Aspects相关的知识,希望对你有一定的参考价值。

参考技术A 导入aop模块:spring-aspects

xml实现: 开启基于注解版的切面功能<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

1.通知方法

    1.1 前置通知@Before

    1.2 后置通知@After(目标方法运行结束后执行,【正常结束或异常结束都调用】)

    1.3 返回通知@AfterReturning (目标方法正常返回后执行)

    1.4 异常通知@AfterThrowing

    1.5 环绕通知@Around (动态代理 ,手动推进目标方法运行[joinPoint.proceed])

2.定义业务逻辑类,在运行时执行通知方法

3.定义日志切面类,里面方法要动态感知逻辑类方法(给切面类方法标注何时何地运行通知方法)

4.将切面类和逻辑类都加入到容器,切面类加@Aspect注解

5.在配置类加@EnableAspectJAutoProxy开启基于注解版的切面功能

使用切面总结:

    1.将业务逻辑组件和切面类都加在容器中,告诉spring哪个是切面类@Aspect

    2.在切面类上每一个通知方法上标注通知注解,告诉Spring什么时候运行

    3.开启aop模式@EnableAspectJAutoProxy

006Spring面向切面

01、基本术语---->POM中配置spring-aspects

1、通知(Advice)---->要做的事
    前置通知(@Before)
    后置通知(@After)
    返回通知(@AfterReturning)
    异常通知(@AfterThrowing)
    环绕通知(@Around)
2、连接点(Join point)---->可能会应用通知的时机

3、切点(Pointcut)---->一个或多个连接点

4、切面(Aspect)---->通知+切点

5、引入(Introduction)---->向现有类添加新方法或属性

6、织入(Weaving)
    编译期
    类加载期
    运行期---->Spring AOP

02、基本特性

    只支持方法调用相关的连接点
    基于动态代理(运行期织入)03、Spring AOP所支持的AspectJ切点指示器

实际执行匹配
    execution()
限制
    args()        指定参数
    @args()        指定参数注解
    this()        
    target
    @target()
    within()    限制连接点类
    @within()
    @annotation
指示器连接符
    &&    ||    !

04、Spring AOP支持的bean()指示器

  使用bean ID或名称作为参数来限制,只匹配特定的bean05、不处理参数的切面

开启自动代理
@Configuration
@EnableAspectJAutoProxy---->启动自动代理
@ComponentScan
public class ConcertConfig{
    @Bean
    public Audience audience(){---->切面
        return new Audience();
    }
}
某连接点
package concert;
public interface Performance{
    public void perform();
}
@Aspect
public class Audience {
    @Pointcut("execution(*concert.Performance.perform(..)) && within(concert.*)")---->定义命名的切点
    public void performance(){}---->切点名称,仅供附着
    
    @Before("performance()")
    public void do1(){}
    
    @After("performance()")
    public void do2(){}
    
    @Around("performance()")
    public void do3(ProceedingJoinPoint jp){---->若函数本来有参数,jp参数要放在最左边
        System.out.println("Before");
        jp.proceed();---->可以不掉用,也可多次调用;若有返回值,在最后也该返回,以免影响原线程
        System.out.println("After")
    }
    
    @AfterReturning("performance()")
    public void do4(){}
    
    @AfterThrowing("performance()")
    public void do5(){}
    
    
}

06、带参数切面

开启自动代理
...
某连接点
public class BlankDisc{
    public void playTrack(int trackNumber){
        ...
    }
}
切面
@Aspect
public class TrackCounter {
    private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();
    
    @Pointcut("execution(* soundsystem.CompactDisc.playTrack(int)) && args(trackNumber)")//使用args()在切点中声明参数,此参数将传递到通知中
    public void trackPlayed(int trackNumber) {}
    
    @Before("trackPlayed(trackNumber)")
    public void countTrack(int trackNumber){
        int currentCount = getPlayCount(trackNumber);
        trackCounts.put(trackNumber, currentCount + 1);
    }
    
    public int getPlayCount(int trackNumber){
        return trackCounts.containsKey(trackNumber)? trackCounts.get(trackNumber) : 0;
    }
}

07、通过切面为Performance接口引入新功能

public interface Encoreable {
    void performEncore();
}

@Aspect
public class EncoreableIntroducer {
    @DeclareParents(value = "concert.Performance+", defaultImpl = DefaultEncoreable.class)
    public static Encoreable encoreable;---->引入的接口
}
value---->指定哪种类型的bean引入此接口
defaultImpl---->指定为引入功能提供实现的类
@DeclareParents注解标注的静态属性指明要引入的接口

 


以上是关于spring切面Aspects的主要内容,如果未能解决你的问题,请参考以下文章

Spring中切面详解(AOP)

Java Spring 切面 aop 超时?

Spring - 切面表达式(切面编程AOP)

Spring boot切面不生效问题

Spring之面向切面编程指定切面执行顺序

Spring框架--AOP面向切面编程