标签:的区别 target XML get 术语 tac tst 运行 之一
AOP是面向切面(方面)编程,扩展功能不修改源代码实现,其采取横向抽取机制,取代了传统纵向继承体系重复性代码。在其底层,使用动态代理来实现,对于有接口情况,使用动态代理创建接口实现类代理对象;对于没有接口情况,使用动态代理创建类的子类代理对象。
对于有接口的情况:
对于没有接口的情况:
AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,SpringAOP是一种基于方法拦截的AOP,在Spring中有四种方式去实现AOP的拦截功能。
1)使用 ProxyFactoryBean 和对应的接口实现AOP
2)使用 XML 配置 AOP
3)使用@AspectJ 注解驱动切面
4)使用AspectJ 注入切面
在Spring AOP的拦截方式中,真正常用的是用 @AspectJ 注解的方式实现的切面。
package com.cnblogs.demrystv.aop.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclareParents; import org.aspectj.lang.annotation.Pointcut; import com.cnblogs.demrystv.aop.verifier.RoleVerifier; import com.cnblogs.demrystv.aop.verifier.impl.RoleVerifierImpl; import com.cnblogs.demrystv.game.pojo.Role; @Aspect public class RoleAspect { @DeclareParents(value= "com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl+", defaultImpl=RoleVerifierImpl.class) public RoleVerifier roleVerifier; @Pointcut("execution(* com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..))") public void print() { } @Before("print()") // @Before("execution(* // com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..))") public void before() { System.out.println("before ...."); } @After("print()") // @After("execution(* // com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..))") public void after() { System.out.println("after ...."); } @AfterReturning("print()") // @AfterReturning("execution(* // com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..))") public void afterReturning() { System.out.println("afterReturning ...."); } @AfterThrowing("print()") // @AfterThrowing("execution(* // com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..))") public void afterThrowing() { System.out.println("afterThrowing ...."); } @Around("print()") public void around(ProceedingJoinPoint jp) { System.out.println("around before ...."); try { jp.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("around after ...."); } @Before("execution(* com.cnblogs.demrystv.aop.service.impl.RoleServiceImpl.printRole(..)) " + "&& args(role, sort)") public void before(Role role, int sort) { System.out.println("before ...."); } }
标签:的区别 target XML get 术语 tac tst 运行 之一
原文地址:https://www.cnblogs.com/Demrystv/p/9271388.html