基于注解的AOP开发
1.快速开发步骤:
- 创建目标接口和目标类(内部有切点)
TargetInterface、Target
- 创建切面类(内部有增强方法)
MyAspect—(before、afterReturning…)
- 将目标类和切面类的对象创建权交给spring
加注解@Component(“name”)
切面类声明@Aspect
- 在切面类中使用注解配置织入关系
@Before(“execution(方法地址)”)
@Before("execution(* com.it.anno.Target.*(..))")
public void before(){
System.out.println("前置增强.........");
}
- 在配置文件中开启组件扫描和AOP的自动代理
applicationContext_anno.xml
<!--开启注解扫描-->
<context:component-scan base-package="com.it.anno"></context:component-scan>
<!--开启aop自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext_anno.xml")
public class AnnoTest {
@Autowired
private TargetInterface target;
@Test
public void test1(){
target.save();
}
}
2.切点表达式抽取(封装)
- 法一:
@Component("myAspect")
@Aspect
public class MyAspect {
@Before("MyAspect.myPoint()")
public void before(){
System.out.println("前置增强.........");
}
@AfterReturning("myPoincut()")
public void afterReturning(){
System.out.println("后置增强.........");
}
@Pointcut("execution(* com.it.anno.Target.*(..))")
public void myPoincut(){}
}
- 法二:
新建一个Poincut类,使用@Before等注解直接@Before(“Poincut.myPoincut()”)引用方法就行
public class Poincut {
@Pointcut("execution(* com.it.anno.Target.*(..))")
public void myPoincut(){
}
}
3.知识要点
-
注解aop开发步骤
- 使用@Aspect标注切面类
- 使用@通知注解标注通知方法
- 在配置文件中配置aop自动代理aop:aspectj-autoproxy/
-
通知注解类型
名称 | 标签 | 说明 |
---|---|---|
前置通知 | @Before | 指定增强的方法在切入点方法之前执行 |
后置通知 | @AfterReturning | 指定增强的方法在切入点方法之后执行 |
环绕通知 | @Around | 指定增强的方法在切入点方法之前和之后都执行 |
异常抛出通知 | @AfterThrowing | 指定增强的方法在出现异常的时候执行 |
最终通知 | @After | 无论增强方法执行是否有异常都会执行 |