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面向切面的主要内容,如果未能解决你的问题,请参考以下文章