基于AspectJ的AOP开发(XML方式)
AOP(Aspect Oriented Programming):面向切面编程,是OOP的扩展和延伸,是用来解决OOP遇到问题。
AOP的底层实现:
动态代理:代办、方法增强。被代理类、代理类 里使用被代理类
- JDK的动态代理:只能对实现了接口的类产生代理。实现InvocationHandler接口,重写invoke( )方法,使用反射生成代理类。
- Cglib的动态代理:对没有实现接口的类产生代理对象。创建该类的 子类代理对象。实现MethodInterceptor接口,重写intercept( )方法。
可见Spring的AOP是基于动态代理实现的,谈到动态代理就不得不提下静态代理。
那为什么AOP不使用静态代理呢?
因为静态代理只能代理一个具体的类,如果要代理一个接口的多个实现的话需要定义不同的代理类。解决这个问题就可以用到 JDK 的动态代理。
AOP的相关术语
- 连接点:可以被拦截的点。
- 切入点:真正被拦截的点。
- 通知:增强方法
- 引介:类的增强
- 目标:被增强的对象
- 织入:将增强应用到目标的过程。
- 代理:织入增强后产生的对象
- 切面:切入点和通知的组合
AOP的入门开发
- 编写目标类并配置
- 编写切面类并配置
- 进行aop的配置
<!-- AOP的配置:完成对目标类产生代理 -->
<aop:config>
<!-- expression: 表达式配置那些类的那些方法需要进行增强 -->
<aop:pointcut expression="execution(* com.google.spring.demo1.ProductDaoImpl.save(..))" id="pointcut1"/>
<!-- 配置切面 -->
<aop:aspect ref="myAspect">
<aop:before method="checkPri" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
通知类型
- 前置通知:@Before
- 后置通知:@AfterReturning
- 环绕通知:@Around
- 异常抛出通知:@AfterThrowing
- 最终通知:@After
基于AspectJ的AOP开发(注解方式)
AOP的入门开发
- 编写目标类并配置
- 编写切面类并配置(在切面类上使用注解)
- 进行aop的配置
<!-- 在配置文件中开启注解的AOP的开发 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect
public class MyAspectAnno {
@Before(value="MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置增强=====================");
}
//切入点注解
@Pointcut(value="execution(* com.google.spring.demo1.OrderDao.save(..))")
private void pointcut1(){}
}
@Aspect:定义切面类的注解
@Pointcut:定义切入点的注解
如有错误,欢迎留言指正 * _ *