AOP:面向切面编程,核心原理是使用动态代理模式在方法执行前后或出现异常时加入相关逻辑。
通过定义可以发现:
AOP是基于动态代理模式。
AOP是方法级别的(要测试的方法不能为static修饰,因为接口中不能存在静态方法,编译就会报错)。
3.AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。
Spring是如何生成代理对象的?:
1.创建容器对象的时候,根据切入点表达式拦截的类,生成代理对象。
2.如果目标对象有实现接口,使用jdk代理。如果目标对象没有实现接口,则使用Cglib代理。然后从容器获取代理后的对象,在运行期植入"切面"类的方法。
spring AOP生成代理类的源码
//创建AOP代理对象
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//如果AOP使用显式优化,或配置了目标类,或只使用Spring支持的代理接口
if ((config.isOptimize()) || (config.isProxyTargetClass()) || (hasNoUserSuppliedProxyInterfaces(config))) {
//获取AOP配置的目标类
Class targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
}
//如果配置的AOP目标类是接口,则使用JDK动态代理机制来生成AOP代理
if ((targetClass.isInterface()) || (Proxy.isProxyClass(targetClass))) {
return new JdkDynamicAopProxy(config);
}
//如果AOP配置的目标类不是接口,则使用CGLIB的方式来生成AOP代理
return new ObjenesisCglibAopProxy(config);
}
return new JdkDynamicAopProxy(config);
}
我们拿Spring AOP做什么?
1.Spring声明式事务管理配置。
2.Controller层的参数校验。
3.使用Spring AOP实现MySQL数据库读写分离案例分析
4.在执行方法前,判断是否具有权限。
5.对部分函数的调用进行日志记录。监控部分重要函数,若抛出指定的异常,可以以短信或邮件方式通知相关人员。
6.信息过滤。