定义一个普通dao类和daoImpl类来模式实现三种aop,对dao类中的方法进行增强日志功能
定义一个DAO接口:
public interface Dao {
void insert();
void query();
void update();
}
DAO接口实现类:
public class DaoImpl implements Dao {
@Override
public void insert() {
System.out.println("add boeing787!");
}
@Override
public void query() {
System.out.println("boeing737Max over in 20190311");
}
@Override
public void update() {
System.out.println("update boeing 737Max to 737-800!");
}
}
1.装饰者类:
public class DaoDecorator implements Dao {
Dao dao;
public DaoDecorator(Dao dao) {
this.dao = dao;
}
@Override
public void insert() {
System.out.println("---decorator bofore...");
dao.insert();
System.out.println("---decorator after...");
System.out.println("---------------------------------------");
}
@Override
public void query() {
System.out.println("---decorator bofore...");
dao.query();
System.out.println("---decorator after...");
System.out.println("---------------------------------------");
}
@Override
public void update() {
System.out.println("---decorator bofore...");
dao.update();
System.out.println("---decorator after...");
System.out.println("---------------------------------------");
}
}
2.jdk代理类:
public class DaoJDKProxy implements InvocationHandler {
private Object target;
public DaoJDKProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("---jdk before...");
Object object = method.invoke(target,args);
System.out.println("---jdk after...");
System.out.println("---------------------------------------");
return object;
}
}
3.cglib代理类:
public class DaoCglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("---cglib bofore...");
Object result = methodProxy.invokeSuper(o,args);
System.out.println("---cglib after...");
System.out.println("---------------------------------------");
return result;
}
}
4.统一测试类:
public class Test {
public static void main(String[] args) {
//装饰者模式的aop
DaoDecorator daoDecorator = new DaoDecorator(new DaoImpl());
daoDecorator.insert();
daoDecorator.query();
daoDecorator.update();
//jdk模式的aop
DaoJDKProxy daoJDKProxy = new DaoJDKProxy(new DaoImpl());
Dao proxy = (Dao) Proxy.newProxyInstance(Test.class.getClassLoader(),new Class<?>[]{Dao.class},daoJDKProxy);
proxy.insert();
proxy.query();
proxy.update();
//cglib模式的aop
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(DaoImpl.class);
enhancer.setCallback(new DaoCglibProxy());
DaoImpl dao = (DaoImpl) enhancer.create();
dao.insert();
dao.query();
dao.update();
}
}
5.运行结果:
"C:\Program Files\Java\jdk1.8.0_171\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA
---decorator bofore...
add boeing787!
---decorator after...
---decorator bofore...
boeing737Max over in 20190311
---decorator after...
---decorator bofore...
update boeing 737Max to 737-800!
---decorator after...
---------------------------------------
---jdk before...
add boeing787!
---jdk after...
---------------------------------------
---jdk before...
boeing737Max over in 20190311
---jdk after...
---------------------------------------
---jdk before...
update boeing 737Max to 737-800!
---jdk after...
---------------------------------------
---cglib bofore...
add boeing787!
---cglib after...
---------------------------------------
---cglib bofore...
boeing737Max over in 20190311
---cglib after...
---------------------------------------
---cglib bofore...
update boeing 737Max to 737-800!
---cglib after...
---------------------------------------
Process finished with exit code 0