在不惊动原始设计的基础上为其做功能的增强,不做代码入侵(不改变原来的函数内容就增强这个函数的功能)。
用大白话说就是A,B,C 三个方法,其中A,B方法都需要加某一个功能D(方法),那么就把这个功能D(方法)抽取出来,单独作为一个功能。
其中A,B,C方法就叫做AOP概念中的连接点
A,B方法,叫做切入点(就是哪些方法要追加功能)
而你抽取出来的这个功能D就叫通知
通知与切入点需要进行连接,连接通知D和方法A,B的叫做切面 ,切面描述的是通知与切入点的关系。
所谓面向切面编程,说的切面,就是指这个切面。
由于Java中一个方法不能独立存在,所以这个D方法存在的类,就叫通知类
下载,密码f8tf
https://pan.baidu.com/s/1HueArdpn-sjyAI_11hrqaQ?pwd=f8tf
下载后用IDEA打开,执行App类
如果出现这里爆红
点击
然后,把App设置为启动类即可。
现在运行APP,先执行update方法,见控制台输出
通过查看BookDaoImpl类可知,一个有显示时间的方法,一个没有。
我们现在的任务是,在无代码侵入的情况下,给update这个方法加上输出当前时间的功能。
实现AOP的具体做法如下
先完成第一步导入坐标
这里如果你今后想不起来如何导入,其实直接百度就行
在pom.xml中导入如下坐标
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
连接点:其实在Java里,一个方法就是一个连接点,这里我已经在代码里为大家写好了,这里说的连接点就是BookDaoImpl类下的save(),update()方法,所以大家可以直接进入下一步,制作共性功能。
这一步是重点
。
制作共性功能首先要创建通知类。
首先要在主包,也就是com.itheima下面建立一个包叫aop,然后创建一个类,我们以MyAdvice为类名(这里这个类名你可以任意取,类命名规范即可,就是一个通知类,我们一会儿要写通知在里面)
为了让MyAdvice类被Spring管理,我们需要加一个@Component
注解
由于使用AOP编程有两种方式,xml与注解,我们这里使用开发中最常用的注解方式进行演示,注解方式需要给MyAdvice前面加上@Aspect
注解
但是单单加上这个注解还不够,我们还需要通知Spring,我们要进行AOP切面编程,Spring在识别这个@Aspect注解前,还需要一个注解加载Spring配置上,使Spring支持aop的注解开发,即可以开始识别类上的,@Aspect这个注解了。
给SpringConfig加上@EnableAspectJAutoProxy
注解。
创建完通知类后,我们自然要写通知在里面。
还记得什么是通知吗?
通知,通知要写到通知类里
定义通知的方式如下
public void method(){
System.out.println(System.currentTimeMillis());
}
通知其实就是一个方法,我们这样就把通知定义好啦!!
这个通知的功能就是输出当前时间。
还记得切入点是什么吗? 切入点就是你要去增强哪个方法。
我们在定义完通知之后,还需要定义切入点,接下来我们看如何定义切入点。
切入点:即我们要增强哪个方法。
想想我们的任务:
我们现在的任务是,在无代码侵入的情况下,给update这个方法加上输出当前时间的功能。
所以切入点就是这个update方法。
声明一个切入点的方法是这样的
@Pointcut("execution(void com.itheima.dao.BookDao.update())")
private void pt(){}
也许你会对这种定义方式毫无头绪,接下来我来慢慢解释。
@PointCut
是表示定义切入点的一个注解,有了这个注解,我们就可以声明一个方法,来代表我们的切入点。
记住,切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑。
也就是这里的pt()
方法
execution意味执行,其实这里就是表示,你要让pt这个方法,具体表示哪个方法呢?
显然我们要表示的是update方法,而我们知道,方法是可以重载的,单单依靠update这个方法名,在一个类下,无法确定唯一的方法。
只有
三者才能在类下确定唯一的一个方法,所以我们首先要在execution里写的就是
方法的返回值 void
其次我们要说明要增强的这个方法位于哪个包,哪个类下,并且参数情况是什么样的。
这样最终就写成了我们看到的这样的形式
相比看到这里大家对定义切入点以及定义通知有了清晰的认识。
这还不够,切入点和通知还没有进行绑定,接下来我们看如何绑定切入点和通知。
这一步很简单。
我们只需要在通知前面加上注解,告诉这个通知,具体要应用于哪个切入点就可以了!
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
至于你想让这个通知方法在切入点前执行还是切入点后执行,你可以通过@Before
或@After
来进行控制,我们以@Before
为例演示。
需要注意的是这里你在绑定的时候需要把方法名连带()一起写上。
目前,我们已经增强了update方法,在App类里调用看一下吧!!
哈哈哈,怎么样,你已经初步掌握了如何使用AOP来进行对方法的无侵入增强!!
我们在不对原始代码update更新的基础上就完成了对update方法的增强。
掌握了对AOP使用的第一步,后面就会轻松很多!!
如果你喜欢这篇文章的话,请给我点一个赞吧!非常的感谢!💕
我会尽力后续写出类似这篇文章一样清晰易懂的文章,如果你想看更多我写出的文章,就请关注我吧!!
如果你无法顺利完成,可以参照我的完整代码,做出修改。
下载,密码r5xe
https://pan.baidu.com/s/1hmj6b49wICp0zzq4MKaLYA?pwd=r5xe
得到文件夹后使用IDEA打开