⑦. 基于注解的AOP开发
- ①. 注解通知的类型
②. 切点表达式的抽取
@Pointcut:用于定义切入点表达式。在使用时还需要定义一个包含名字和任意参数的方法签名来表示切入点名称。实际上,这个方法签名就是一个返回值为void,且方法体为空的普通的方法
③. 基于注解的AOP
将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)
在切面类上的每一个通知方法上标注通知注解,告诉Spring何时可以运行(切入点表达式)
在配置文件中配置aop自动代理
开启基于注解的aop模式:@EnableApectJAutoProxy
④. 关于JointPoint必须放在方法的第一位参数中
方法 | 说明 |
joinpoint.getargs() | 获取参数 |
joinPoint.getSignature().getName | 获取方法的名称 |
joinpoint.getTarget() | 获取目标方法 |
joinpoint.getThis() | 获取代理对象 |
public interface TargetInterface { public void save(); }
@Component public class Target implements TargetInterface { public void save() { System.out.println("save running"); } }
//掌握 @Component("myAspect") @Aspect//标志当前MyAspectAnnotation是一个切面类 public class MyAspectAnnotation { //定义切点表达式 @Pointcut("execution(* com.xiaozhi.annotation.*.*(..))") public void pointCut(){} /*前置通知*/ @Before(value="pointCut()") public void before(){ System.out.println("前置增强"); } /*后置通知*/ @AfterReturning(value = "execution(* com.xiaozhi.annotation.*.*(..))") public void afterRetruning(){ System.out.println("后置通知"); } /*环绕通知 ProceedingJoinPoint:正在执行的连接点[切点] */ @Around("MyAspectAnnotation.pointCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕前增强..."); //切点方法 Object proceed=pjp.proceed(); System.out.println("环绕后增强..."); return proceed; } }
掌握 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--组件扫描--> <context:component-scan base-package="com.xiaozhi.annotation"/> <!--启动基于注解的声明式AspectJ支持--> <aop:aspectj-autoproxy/> </beans>
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = {"classpath:applicationContext-annotation.xml"}) public class AnnotationTest { @Autowired private TargetInterface target; @Test public void test1(){ target.save(); } }