假设场景:
接口:
实现类:
实习类实现接口的方法实现加减乘除功能:
假如此时需要在加减乘除中加入"日志功能",可以显示对应的信息
使用普通方法实现:
此时需要在实现类的每一个方法中添加对应的非核心代码,代码出现重复,冗余.
这样写在需要给方法添加功能时非常麻烦
我们可以创建一个类,这个类将实现类中重复的方法提取出来,最后再将提取出来的方法插入到对应的类中.
代理的好处,便于后续的维护
举例:房东与中介与租客三者的关系
房客调中介,再通过中介调房东,中介帮助处理非核心业务(公有的重复的方法),房东处理核心业务(自己的方法),从而实现功能
静态代理:
目标类
代理类:
main方法:
动态代理:
JDK动态代理:
JDK代理和CGlib不做了解.
可以发现上面两种代理很麻烦,所以采用AOP代理来简化操作.
面向切面编程思维:
使用注解的方式实现AOP
1.在配置文件通过下面配置开启支持aspectJ注解(二选一)
2.在配置类中则是添加@EnableAspectJAutoProxy注解(二选一)
运行结果:
在AOP的IOC中存储的都是代理对象
通过jointPoint获取方法各种属性值
接收返回的结果
接收报错的异常
总结:
切点表达式语法:
切点表达式的复用
上面的方式不太简洁,我们可以创建一个存储切点的类,单独存储切点表达式
首先创建这个类,同时一定要将他交给IOC进行管理
然后在切点表达式中引用
环绕通知:(需要再方法中国自定义方法的执行)
切面的优先级设置
通过@order属性进行控制
优先级最高的先执行,前置最前执行,后置最后执行