一、AOP概述
AOP:Aspect Oriented Programming,面向切面编程,AOP是OOP(OOP即面向对象编程)的扩展和延伸。
AOP的应用场景:
例如下面的代码:
public class UserDao{
public void save(){
//在保存之前有校验代码
check();
}
public void check(){
//对数据进行校验
}
}
分析:如果有很多想UserDao这样的类都需要包含校验方法check(),对于传统的OOP来说,使用继承的方式,即量check()方法放到一个公共父类中,然后所有想用的类去继承。但是在AOP中,采取的是横向抽取的方式,也即即采用动态代理的方式,需要调用check()方法时,调用一下代理即可。
为什么学习AOP:在不修改源码的情况下对程序进行增强。AOP可以用于进行权限校验、日志记录、性能监控、事务控制等。
AOP底层实现原理:
动态代理:
JDK动态代理:只能对实现了接口的类产生代理;
Cglib动态代理(类似于Javassist第三方的代理技术):对没有实现接口的类产生代理,生成子类对象。
Spring中使用AspectJ:
AOP思想最先有AOP组织联盟提出,Spring对于AOP的实现有自己的方式,但是比较繁琐,已经被弃用了。目前Spring使用的是基于AspectJ的开发。
二、Spring中AOP的XML开发
1.AOP开发的相关术语
class UserDao{
public void save();
public void find();
public void update();
public void delete();
}
Joinpoint:连接点,可以被拦截到的点。增删改查的方法都可以被增强,这些方法就可以被称为连接点。
Pointcut:切入点,真正被拦截的点。在实际开发中,只对save()方法进行增强,save()方法被称为是切入点。
Advice:通知、增强,方法层面的增强。比如,现在对save()方法进行权限校验,权限校验(checkPri)的方法称为通知。
Introduction:引介。类层面的增强。
Target:被增强的对象。例如,对UserDao进行增强,UserDao则称之为目标。
Weaving:织入。将通知(Advice)应用到目标(Target)的过程。例如,将权限校验的方法的代码应用到UserDao中的save()方法的过程。
Proxy:代理对象。
Aspect:切面,多个通知和多个切入点的组合。
2.AOP的XML入门开发
下面举一个例子作为AOP开发的入门,步骤如下:
1)引入.jar包
AOP开发包含针对于IOC开发基本的几个.jar包如下:
com.springsource.org.apache.commons.logging-1.1.1.jar :日志相关包
com.springsource.org.apache.log4j-1.2.15.jar:日志相关包
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
另外需要引入的.jar包:
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:依赖的aspectj包;
org.apache.servicemix.bundles.aopalliance-1.0-1.0.0-rc1.jar:AOP联盟的包;
spring-aop-4.2.4.RELEASE.jar:Spring的AOP的开发部;
spring-aspects-4.2.4.RELEASE.jar:Spring与aspectj整合的包;
spring-test-4.2.4.RELEASE.jar:测试用的包。
2)测试类代码编写
ProductDao接口:
public interface ProductDao {
public void save();
public void update();
public void find();
public void delete();
}
ProductDao接口实现类:
public class ProductDaoImpl implements ProductDao{
public void save() {
// TODO Auto-generated method stub
System.out.println("保存商品。。。");
}
public void update() {
// TODO Auto-generated method stub
System.out.println("修改商品。。。");
}
public void find() {
// TODO Auto-generated method stub
System.out.println("查找商品。。。");
}
public void delete() {
// TODO Auto-generated method stub
System.out.println("删除商品。。。");
}
}
功能增强类:
public class MyAspect {
public void checkPri()</