基于spring中的aop简单实例讲解
作者:jingxian 时间:2023-10-16 21:01:10
aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生。那么骑士只需要关注怎么打仗就好了。而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了。所以可以把诗人当成一个切面,当骑士出征的前后诗人分别负责欢送和写诗歌颂(记录)。而且,这个切面可以对多个骑士或者明人使用,并不只局限于一个骑士。这样,既分离了关注点,也减低了代码的复杂程度。
代码示例如下:
骑士类:
package com.cjh.aop2;
/**
* @author Caijh
*
* 2017年7月11日 下午3:53:19
*/
public class BraveKnight {
public void saying(){
System.out.println("我是骑士");
}
}
诗人类:
package com.cjh.aop2;
/**
* @author Caijh
*
* 2017年7月11日 下午3:47:04
*/
public class Minstrel {
public void beforSay(){
System.out.println("前置通知");
}
public void afterSay(){
System.out.println("后置通知");
}
}
spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 目标对象 -->
<bean id="knight" class="com.cjh.aop2.BraveKnight"/>
<!-- 切面bean -->
<bean id="mistrel" class="com.cjh.aop2.Minstrel"/>
<!-- 面向切面编程 -->
<aop:config>
<aop:aspect ref="mistrel">
<!-- 定义切点 -->
<aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
<!-- 声明前置通知 (在切点方法被执行前调用)-->
<aop:before method="beforSay" pointcut-ref="embark"/>
<!-- 声明后置通知 (在切点方法被执行后调用)-->
<aop:after method="afterSay" pointcut-ref="embark"/>
</aop:aspect>
</aop:config>
</beans>
测试代码:
package com.cjh.aop2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Caijh
*
* 2017年7月11日 下午4:02:04
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");
BraveKnight br = (BraveKnight) ac.getBean("knight");
br.saying();
}
}
执行结果如下:
前置通知
我是骑士
后置通知
=====================================================
aop(面向切面编程)的好处就是,当执行了我们主要关注的行为(骑士类对象),也就是切点,那么切面(诗人对象)就会自动为我们进行服务,无需过多关注。如上测试代码,我们只调用了BraveKnight类的saying()方法,它就自己在saying方法前执行了前置通知方法,在执行完saying之后就自动执行后置通知。通过这样我们可以做权限设置和日志处理。
补充:pointcut执行方法书写格式如下
工程目录结构:
如果运行过程中出现nofoundclass的错误,一般是少了:aspectjweaver.jar这个包,需要下载
标签:spring,aop,实例
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot服务开启后通过端口访问无反应的解决
2022-12-11 03:57:17
![](https://img.aspxhome.com/file/2023/4/91534_0s.jpg)
在当前Activity之上创建悬浮view之WindowManager悬浮窗效果
2023-02-09 21:02:12
C# 扩展方法的使用
2022-04-05 14:46:24
![](https://img.aspxhome.com/file/2023/8/96318_0s.png)
JDK常用命令jps jinfo jstat的具体说明与示例
2021-08-09 16:03:30
![](https://img.aspxhome.com/file/2023/1/110821_0s.png)
SpringBoot结合JWT登录权限控制的实现
2023-10-06 04:54:22
RocketMQ特性Broker存储事务消息实现
2022-07-10 20:42:13
Java二维数组简单定义与使用方法示例
2022-01-28 08:31:37
java异步上传图片示例
2023-05-31 13:42:51
解析ScrollView--仿QQ空间标题栏渐变
2021-06-20 22:44:54
![](https://img.aspxhome.com/file/2023/6/98656_0s.gif)
Java正则之贪婪匹配、惰性匹配
2022-08-14 16:41:23
解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
2021-07-07 22:59:06
Android提高之使用NDK把彩图转换灰度图的方法
2023-07-22 02:00:07
![](https://img.aspxhome.com/file/2023/6/88686_0s.jpg)
Android开发自学笔记(二):工程文件剖析
2021-09-08 11:12:56
Java中的synchronized关键字
2023-07-28 18:39:26
Android框架Volley使用:ImageRequest请求实现图片加载
2022-03-01 11:30:06
![](https://img.aspxhome.com/file/2023/5/113325_0s.jpg)
关于Mybatis-Plus Wrapper是否应该出现在Servcie类中
2023-11-28 22:04:56
Spring Boot 配置和使用多线程池的实现
2022-09-04 19:53:02
Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)
2023-08-06 01:01:56
![](https://img.aspxhome.com/file/2023/9/86009_0s.gif)
Android开发中WebView的简单使用小结
2022-09-11 00:22:43
![](https://img.aspxhome.com/file/2023/2/116012_0s.jpg)
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
2023-02-01 16:23:30