在工作以及面试当中Spring是必不可少的,当然了简单的认知是spring的两大特性: IOC控制翻转(也是依赖注入)、AOP(面向切面)
首先什么叫aop,aop到底能做什么?大致意思是这样的
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
例如我刚才所做的日志切面,记录每次的请求和响应消息入库
我并没有像某些人把插入库的方法写在每个请求的方法里,就像上面说的,减少重复代码,比如你有上百个方法,你要少写多少代码,其次就是如果哪天我不需要这个记录日志了,我直接去掉切面就可以,而不是去改代码,把每个插入的方法都删掉
最后回到aop是如何把它实现在项目中
首先要声明的是很多在学到aop这里,要导包,都会把这两个包导入进
,然后他就认为,嗯,要用aop就必须导入这两个包
那我想说的是,你错了
没这两个包照样可以实现aop
我们就利用spring自己的aop实现机制,虽说aop是有自己的实现机制,但还是得遵循aop联盟的api实现,也就是这个包
这里面全是接口,是不是很熟悉里面的东西
那我们首先用硬编码的方式实现一个aop,什么叫做硬编码,也就是不用xml的方式
比如先来一个前置通知,调用某个方法前先做一件事情
这是我调用某个方法前要做的事情,
然后我们再来定于要调用的方法
看到没 就是这样
需要创建一个代理工厂类 然后把目标类给它 切面也给它
其它的什么后置增强 和环绕增强 都如此
这种写法 当然不会用到工作中 太死板了
那我们再来看看xml中又是怎么实现的
前置通知还是找个通知
只是现在换成了xml方式了,那么你要问的是,不是说声明式事务不也是拿aop实现的吗
那如果用这种xml方式的写法 如何实现声明式事务啊
这就是spring自己的方式实现的声明式事务
然而我说了那么多 只是为了告诉你 spring从始至终都提供了自己的aop实现,但是太麻烦
我们真正喜欢用的是aspect,谁让别人是专业的,
那我们先看看aspect是如何实现aop的,通过xml的方式
spring自带aop,只是平常用的一直都是aspect,spring集成的
呆会继续aspect是如何实现的
首先我们应该牢记 aop都有哪些增强
分别有 前置增强、后置增强、抛出增强、环绕增强、引入增强
增强也可以叫做通知 ,所以当某些人说XX通知时也没什么好异样的,aspect的xml实现如下
首先我们要用<aop:config> 来进行aop配置 子元素中再配置切面
我们看看通知里面都有什么
这个通知并不需要实现任何类,但定义的方法必须遵守相关的规范,如不同的增强方法参数是有些区别的,如果不写的话,那么会异常,NoSuchMethodException
这个表达式就要根据你自己业务要求,看你的增强都需要加入哪些地方了
再来看看如果我们要声明式事务,不是说它也是拿aop做的嘛,一起看看aspect是如何给你做的。
这样的配置是不是相当熟悉,也是广为项目所用的
最后再来说说最为方便的注解,还是aspect的实现
首先要开启aop的aspect注解,需要在配置里加上一行配置
这里面默认是false默认false代表带着所有的代理全用jdk动态代理实现,
当你改为true时则用cglib动态代理实现
两者的区别也是常被考的
无非是需要jdk动态代理实现的目标类需要接口,而cglib动态代理实现的目标类不需要接口,它是直接生成新的字节码方式给你一个代理对象
所以当我们平常某个目标类,万一没写接口,其实也是可以被代理的,就很好理解了,这些都由spring aop底层帮你判断,默认jdk,没有接口,就用cglib