一. 概念:
即面向切面编程,采取横向抽取机制,将分散在各个地方中的重复代码提出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方
二. 实现方法:
1. 动态代理。
条件: 必须要有接口才能创建对象那个,否则,将无法创建。
例子:
1. 创建UserDao接口:
2. 实现UserDao类:
3.创建切面类:
4.创建MyProxy代理类并且实现InvocationHandler接口,并覆盖invoke()方法。
注:代理:newProxyInstance(ClassLoader loader,class<?> clazz,InvocationHandler h)
其中:
第一个参数:指定生成代理对象的类的加载器,通过getClassLoader()方式获取
第二个参数:获得被代理对象实现的接口,先获取被代理对象的字节码,再通过getInterfaces()获取
第三个参数:一般为new InvocationHandler()
public class MyProxy implements InvocationHandler {
//声明目标类接口
private UserDao userDao;
//创建代理方法
public UserDao creatProxy(UserDao userDao){
this.userDao = userDao;
//生成动态代理
//首先生成类加载器
ClassLoader loader = MyProxy.class.getClassLoader();
//指定被代理的对象
Class [] classes = userDao.getClass().getInterfaces();
return (UserDao) Proxy.newProxyInstance(loader,classes,this);
}
@Override
/*
* 实现InvocationHandler接口,则要实现invoke方法
* 其中第一个参数: 指的是代理类
* 第二个参数: 指的是被代理对象的方法
* 第三个参数: 指的是第二个参数的参数数组
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect = new MyAspect();
myAspect.beforeAdvice();
Object object = method.invoke(userDao,args);
myAspect.afterAdvice();
return object;
}
}
invoke()方法的详细介绍:
5. 测试:
三. AOP的名词解释:
1. Aspect(切面): 即封装用于横向插入的系统功能,如上述例子中的MyAspect类
2. Jointcut(切入点): 即所有可以增强的方法,如上述例子中UserDao接口中的方法即为切入点
3. Advice(通知): 即切面中的具体方法(系统功能)
4. Target Object(目标对象): 即所有被代理的对象或被增强的对象,如上例指的是UserDao接口
5. Proxy(代理): 形成代理对象,如上例指的是MyProxy proxy = new MyProxy();
6. Weaving(织入): 把通知应用到切入点的过程,如上例中的UserDao userDao2 = (UserDao)proxy.creatProxy(userDao1);