Spring框架学习-Spring的AOP概念详解
一.SpringAOP的概述。
AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行期间动态代理实现程序的功能的统一维护的技术。AOP是OOP(面向对象编程)的扩展和延伸。举个例子,让大家对AOP印象更加深刻点。
比如权限校验。实际开发中,我们知道不是所有人都可以进行增删改查的操作,只有管理员才可以,所以我们需要在进行增删改查之前都需要进行权限校验。传统纵向继承(面向对象的特征)就是定义一个BaseDao,里面含有一个权限校验的方法,让Dao直接继承
BaseDao,这样就可以直接调用Dao父类中的权限校验方法。而AOP则采用的是横向抽取机制替代了传统的纵向继承,也就是通过生成代理的方式来解决。这就是对方法进行扩展的两个方法的思想。
AOP应用:权限校验,日志记录,性能监控(运用代理,分别在代码前后插入记录时间),事务控制
二.Spring底层实现AOP的原理。
底层用到了两种代理机制:
JDK动态代理:针对实现了接口的类的代理(java基础的代理)。
Cglib的动态代理:针对没有实现接口的类产生的代理,底层用的是字节码增强技术,通过生成当前类的子对象来产生代理。
被代理类
public class UserDaoImpl implements UserDao { @Override
public void insert() {
System.out.println("用户增加....");
} @Override
public void remove() {
System.out.println("用户移除....");
} }
JDK动态代理:
public class MyJDKProxy implements InvocationHandler {
// 定义属性,传入实现类对象,也可以不用,但是后面就要用类名,而不是引用
private UserDaoImpl userDao; public MyJDKProxy(UserDaoImpl userDao) {
this.userDao = userDao;
} // 创建UserDao动态代理
public UserDao createUserProxy() {
/*
* 第一个参数。告诉虚拟机用哪个字节码加载器加载内存创建字节码文件。
* 第二个参数。告诉虚拟机内存中创建的字节码文件中应该有哪个方法(这些方法方法体为空)。获取类的接口(类的方法可能增加,但接口的方法是固定的)
* 第三个参数。告诉虚拟机底层正在创建的字节码上的各个方法如何处理。
* */
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(MyJDKProxy.class.getClassLoader(), userDao.getClass().getInterfaces(), this);
return userDaoProxy;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equalsIgnoreCase("insert")) {
System.out.println("权限校验");
}
// 执行被代理类原有的方法
return method.invoke(userDao, args);
} }
运行结构
权限校验
用户增加....
Cglib的父类:
public class CustDao { public void remove() {
System.out.println("顾客移除");
}
}
Cglib动态代理:
public class MyCglibProxy { public CustDao createProxy() {
// 创建cglib和心类
Enhancer enhancer = new Enhancer();
// 设置父类
enhancer.setSuperclass(CustDao.class);
// 设置回调
enhancer.setCallback(new MethodInterceptor() { @Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if("remove".equalsIgnoreCase(method.getName())) {
// 执行被代理父类的方法
Object obj = methodProxy.invokeSuper(proxy, args);
System.out.println("日志记录");
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}); // 生成代理
CustDao custDao = (CustDao) enhancer.create();
return custDao;
}
}
运行结果:
权限校验
用户增加....
顾客移除
日志记录
Spring框架学习-Spring的AOP概念详解的更多相关文章
- spring框架学习笔记2:配置详解
简单写一个类做示例: package bean; public class User { private String name; private Integer age; public String ...
- Spring框架学习——Spring的体系结构详解
1.Spring简介 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题.它是一个分层的JavaSE/JavaEE ...
- Spring——面向切面编程(AOP)详解
声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...
- Spring框架学习-Spring和IOC概述
一:什么是Spring框架? spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架.是为了解决企业开发的复杂性而创建的.框架的主要优势是分层架构,Sprin ...
- Spring MVC 学习)——控制器与@RequestMapping详解
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解 一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求 ...
- [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)
一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...
- SPRING AOC、AOP 概念详解
AOC 依赖注入:就是通过容器来控制业务对象之间的依赖关系.也就是把需要的业务对象都放入容器中,需要注入时,通过反射技术来动态获取指定的对象,装配到当前使用对象.代替了原始的 new 来实现对象的实例 ...
- hibernate框架学习笔记3:API详解
Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...
- struts2框架学习笔记2:配置详解
核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC ...
随机推荐
- nginx开发_ngx_palloc源码解析
功能简介 ngx_pool_t是nginx开发中最经常使用到的内存容器.对动态内存的封装,由框架进行创建与释放,模块开发过程中仅需要进行内存申请,不需要关注何时释放.常见的pool对象有: 1. ng ...
- [POI 2000] 病毒
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2938 [算法] 首先建出给定字符串集的AC自动机 存在无限长的代码当且仅当 : AC ...
- HDU 1627 Krypton Factor
回溯法:避免无用判断,强化回溯代码的实现过程 题目的大意就是以字典序为准,排列字符串,但要保证一个字符串中不包含相邻的重复子串. Problem Description For example, th ...
- powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
转自:https://www.cnblogs.com/CoffeeHome/archive/2014/06/04/3767501.html 这里powerdesigner连接的数据库是以mysql为例 ...
- jquery : eval() 解析json的注意
jquery eval解析JSON中的注意点介绍 来在:http://www.jb51.net/article/40842.htm 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: ...
- android调试之adb
ADB 其实大部分的PC开发机与Android设备的操作都是通过adb(android debug bridge)技术完成的,这是一个C/S架构的命令行工具,主要由三个部分组成 运行在PC开发机上的命 ...
- http协议之版本差异(2)
—————————————HTTP1.0/HTTP1.1—————————————— 建立连接方面 HTTP/1.0 每次请求都需要建立新的TCP连接,连接不能复用.HTTP/1.1 新的请求可以在上 ...
- Spring Boot 学习系列(07)—properties文件读取
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...
- 洛谷 - P3164 - 和谐矩阵 - 高斯约旦消元法
为什么可以跑n立方,我也不知道,反正就是可以. 模2意义的,据说每一行可以存一个bitset,会比用bool更快(快32倍?). 本题告诉我们一个道理: 高斯消元之后,每个变量的含义不变(虽然交换了两 ...
- PhpStorm之操作数据库
对数据库进行基本的操作 还不清楚如何使用PhpStorm连接本地数据库的朋友看一下我的上一篇博客配置数据库连接 点击已经连接好的数据库,找到下图中的 Consoles,然后点击 console(def ...