写在前面:aop编程主要用到的是设计模式是代理模式,关于代理模式,请看前一篇文章《浅析代理模式》https://blog.csdn.net/ah3629/article/details/82352206
1、概述
AOP(aspect object programming) 面向切面编程,功能是让关注点代码与业务代码分离。
关注点:重复的代码就叫关注点。
切面:关注点代码形成的类,就叫切面(类)。
面向切面编程,指的是对很多功能都有的重复代码进行抽取,再在运行的时候向业务方法上动态植入“切面类代码”。
切入点:执行的目标对象方法。以动态植入切面代码。可以通过切入点表达式,指定拦截哪些类的哪些方法,给指定的类在运行的时候植入切面类代码。
2、手动实现AOP编程
实现aop编程主要是就要将关注点代码和业务代码分离,在运行业务代码时,动态的植入关注点代码。这里以保存(save)方法为例,将save方法执行过程中的开启事务处理异常,提交事务这一部分代码抽取出来,在运行save时再将这部分代码动态植入。
分离关注点代码与业务代码的方式有三种: 过程式/对象式/代理模式分离,这里只说代理模式。
分离关注点代码与业务代码的好处:
1)关注点代码写一次即可;
2)开发者只需关注核心业务;
3)运行时期,执行核心业务代码的时候动态植入关注点代码。
代码实现为:接口类
public interface IUserDao {
void save();
}
接口实现类:
@Component
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("核心业务:保存成功");
}
}
切面类:
@Component
public class Aop {
public static void begin(){
System.out.println("开启事务/异常");
}
public static void commite(){
System.out.println("提交事务/关闭");
}
}
代理工厂类:
public class ProxyFactory {
//维护一个目标对象
private static Object target;
private static Aop aop;
public static Object getProxyInstance(Object target_,Aop aop_){
target = target_;
aop = aop_;
return Proxy.newProxyInstance(
target.getClass().getClassLo