AspectJ是基于语言扩展的,在代码运行时才起作用
用AspectJ比用传统的动态代理方式更方便
它们的区别即动态横切和静态横切的区别
动态代理的缺点:
1、它一定要面向接口,如果有一些类没有面向接口编程,则就不能实现注入,不能实现横切,不能实现aop的功能
2、它只能对方法的使用横切,不能加入属性、引介等
故现在基本上都是基于AspectJ来实现
AspectJ的使用方法:
1、配置文件中引入命名空间以及scheme资源
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
2、导入依赖包
3、开启AspectJ的自动代理(在applicationContex-aop.xml中)
4、基于注解的方式
(要在applicationContext-aop.xml文件中进行配置(对包进行扫描,以使用注解))
(1)告诉类这是一个切面
(2)写明是以什么样的方式切入(前置、后置等)以下以前置为例
value是用表达式的语法来写的,其中一定要有一个execution(),其中的参数以空格隔开
语法:execution(访问修饰符,返回值类型,类,方法,参数 )(括号里的内容可选)
访问修饰符指定public/private/...可以切入(其他的同理)
①最开始的 * :任意的返回值类型都会被切入
②某个包下的任意的类的任意的方法的任意的参数
(3)xml中创建切面(虽然说并不会使用切面对象,但是还是要把它创建出来)
(这里id不写也可以,因为Spring-IoC给每个对象都取了名字,那个名字才是真正的id,所以这里不需要也可以)
5、运行效果: