006Spring面向切面

Posted TBBS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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注解标注的静态属性指明要引入的接口

 


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

如何理解spring中的切面和过滤

Spring的AOP面向切面编程

Spring的AOP面向切面编程

Spring面向切面编程

Spring框架深入--AOP面向切面

Spring的AOP面向切面编程