目录
课程介绍
假如a是用户管理模块b是员工管理模块都拥有自己的业务处理类
现在要求两个模块从上到下业务处理的过程中都要进行权限过滤,只有拥有权限的用户才能访问对应模块,我们可能回去代码前增加权限判断的代码,如果不需要了,还要代开代码再去掉,有没有更好的办法?springaop就可以很好地解决
执行前或者执行后都可以额外的去增加相应的扩展功能,这个扩展功能称为切面
当不需要了还可以快速移除
就像浏览器中的各种插件,不需要就可以移除
为什么这些外挂的扩展功能被称为切面呢?这些软件模块想横切面一样穿插在了我们原始软件的运行过程中吗,切面aspect其实就是横切面的意思
正式了解
感性认识一下
两个dao两个service,分别对应了员工表的增删改查,和用户表的增删改查
还有两个Service
员工服务:提供员工日常相关的服务
userService
打印出两个方法各自执行时的时间,通过时间信息在具体的什么时段是应用程序负载最高的时刻
这样不就可以了吗?加入我们有很多类复制粘贴很多次也是很麻烦的事。假如不需要时间输出了是不是还得挨个删啊,这样的工作显然十分低级。我们完全可以对这些方法进行拦截,在运行前来打印时间,然后再去执行方法内部的代码。像这种不用修改源代码,对原有程序行为进行扩展的技术就是springaop
演示
引入依赖
具备了aop功能但并未意味着是可用的,还有在引入其他模块
只有引入了他才可以正常的运行
创建xml文件
增加了一个名为aop的命名空间 ,这个aop是必须用到的,给我们提供了aop需要的标签
ioc容器配置好了,为了能让这个ioc容器运行起来,增加入口类
调用
模拟创建新用户的过程
上面一句话来自userService下面来自对应的daoinsert方法
要求在执行Service或者Dao任何方法的时候都要打印出当前方法所要执行的时间,在原有方法上面增加时间打印,实在是太低级了,而且非常不方便,通过aop就可以非常轻松的实现这个需求
新增包aspect
新建针对于方法的切面类
什么是目标类/目标方法?真正要执行的方法就是目标方法
它所隶属的类就称作目标类
这样就完成了额外功能的扩展,在方法运行前来将对应的类和方法名称在控制台中进行打印,可是MethodAspect可不知道你这个类是要在哪些方法运行前执行。
所以还是要在applicationContext.xml里利用aop进行配置,说明切面类作用的范围是什么
作为aop底层运行也是要在ioc容器中的,定义一个bean让ioc容器去实例化
methodAspect作为ioc容器运行的时候只会把他当成普通的bean进行加载,如果要让ioc容器认为这是一个切面类的话就必须使用
来进行定义,因为原始的切面类里头包含了
这个方法,before指向printExecutionTime
切面类所作用的范围是切点所决定的,用在了
这条路径的所用方法上
运行效果
当不再需要这个需求时,把它注释掉就好了
aop运行是基于ioc基础上的没有ioc就没有aop
要引入两个依赖
像往常一样对这些bean进行实例注入
厨师ioc容器的方式也是完全相同的
额外增加切面类,在类中增加扩展的功能
参数要求为连接点joinPoint,
然后通过config,对切面进行控制,其中pointcut用于描述当前切面作用在那些类的哪些方法上