spring切面Aspects
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring切面Aspects相关的知识,希望对你有一定的参考价值。
参考技术A 导入aop模块:spring-aspectsxml实现: 开启基于注解版的切面功能<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的主要内容,如果未能解决你的问题,请参考以下文章