对于AOP 我们应该拿OOP来对比学习,它们之间的区别如下:
AOP中不得不提的就是代理:
通俗理解就是:茅台公司生产出酒,而代理商拿出来销售并推出各种销售活动。这时茅台公司就是真实主题,也就是目标对象。而代理商就是代理。茅台酒就是目标对象中的方法。各种销售活动就是给目标对象中的方法的增强补充,比如对方法添加日志等等操作。
代理又分为静态代理和动态代理两种:像这样已知目标对象就是为茅台公司 就为静态代理,这时目标对象已确定
下面为一个静态代理的例子:
先定义一个PersonBiz的接口:
再对这个接口进行实现
这是我们使用静态代理给这两个方法加上一个操作时间的功能,我就直接上代码了:
package com.yc.dao.impl;
import java.util.Date;
import com.yc.dao.PersonBiz;
//代理对象
public class PersonBizProxy implements PersonBiz {
private PersonBiz personBiz;// 对真实主题的引用
public PersonBizProxy(PersonBiz personBiz) {
this.personBiz = personBiz;
}
@Override
public void add(String name) {
// 加入关注点-》增强的功能
showLog();// 前置增强
// 再调用真实主题的方法
this.personBiz.add(name);
}
@Override
public String find() {
// 调用真实主题的方法
personBiz.find();
// 加入关注点-》增强的功能
showLog();// 后置增强
return null;
}
private void showLog() {
Date d = new Date();
System.out.println("-----------------");
System.out.println("操作时间" + d);
System.out.println("-----------------");
}
}
最后就是测试类:
代理的优势很明显:当你不需要新增的操作时间的功能时,就将PersonBizProxy pbp=new PersonBizProxy(pb);去掉即可,后面改用pb调用方法,让代码很好的实现了可扩展性,也不用在原来已有的代码上修改。
静态代理的缺点:只能针对一个接口进行代理