前言:最近研究Spring框架的Aop功能是研究的如痴如醉,Aop,面向切面编程,是一种思想,是面向对象编程(OOP)的一个补充。因为传统的OOP是自顶向下的,业务是垂直结构,但是总有一些功能穿插在这些功能之中,经常要复用,比如日志,Aop就是为了解决这个问题来的。那么java在实现Aop的时候,有两种方式,AspectJ和Sechma Based。Sechma Based在配置xml文件的时候比较简单,我们就直接略过。AspectJ又可分为配置xml文件和使用注解两种方式。不幸的是,这两种方式我一开始走的都不太顺利,不过折腾了几天总算解决了,特此记录一下。
先说一下我的版本,因为我后面要讲两个错误,很多人说他们出现相同的错误是因为版本问题导致的,我试过改变版本,然并卵,最终发现还是代码问题。
版本:JDK 1.8+Spring 5.0.10+AspectJWeaver 1.9.7+AopAlliance 1.0
方式一:AspectJ xml 方式
1.首先创建一个切点类AopDemo,类里面给个方法Start,需要name和age参数
2.然后新建一个切片类AopAspect,里面写上所有能用到的通知
3.配置xml文件,前提是已经引入了xml的命名空间:xmlns:aop,也已经导了jar包
所以,简写只是省去了arg-names参数而已。
4.测试
至此,方式一 AspectJ xml方式就写完了,中间还遇到过一个问题:
java.lang.IllegalArgumentException: warning no match for this type name
这个问题我折腾了好久,纠其原因还得回到第二步,细心的读者应该发现了,我只在before用到了name和age参数,其他方法里都没用到,所以最开始的时候其他方法里我并没有声明这个两个参数,那就会报这个错。
所以,一旦你要传参,那就必须所有声明的通知中都要去接收这些个参数。
方式二:AspectJ 注解方式
其实这是官方主推的方式了,比较新的Spring框架都是先讲这种方式。
1.配置xml扫描注解所在的包,以及,开启cglib动态代理
2.创建切点类,配置 @Component 和 @Pointcut
3.创建通知类,设置前置后置等,注意红框标注的地方是关键
4.测试
在做这个例子的过程中我也同样遇到了问题,很多人也遇到过这个问题,那就是
java.lang.IllegalArgumentException: error at ::0 incompatible number of arguments to pointcut, expected 1 found 0
这个问题和我们在上面方式一遇到的问题的原因是类似的,那就是一旦切点声明了参数,那么后面的所有通知就必须也得有参数,不能before有参数,after没参数。
总结:AspectJ的xml和注解方式都必须遵循一个原则,
那就是一旦切点声明了参数,那么后面所有的通知,都必须有参数,才能接收到值,否则就会报错,但是报的错是不一样的,只不过引起的原因是一样的。
最近这段时间倒是挺充实的,不断在学习新知识。了解了java的几大框架,
SSH(Spring Structs Hibernate)
SSM(Spring SpringMVC Mybatis)
Spring Boot
Spring Cloud
Spring Boot现在应该是算是最火的框架了吧,等我把Spring MVC拿下了,就去研究研究,我估计Spring MVC 应该和 Asp.net/core MVC 差不多,Spring Coud 据说是微服务框架,有时间了可以玩一玩。最后吐槽一下我们公司的开发模式,还没有做到前后盾分离。。。,都1202年了,还在前后端一起玩,居然还在用IDEA这么重量级的软件写js,也是醉了。Spring MVC怎么就不能前后端分离,只要有一个人,把程序发布出来,所有的前端都去调那个人的接口,不就OK了么,真是死脑筋。
就这样吧,回见~~~