基于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执行方法书写格式如下

基于spring中的aop简单实例讲解

工程目录结构:

基于spring中的aop简单实例讲解

如果运行过程中出现nofoundclass的错误,一般是少了:aspectjweaver.jar这个包,需要下载

标签:spring,aop,实例
0
投稿

猜你喜欢

  • SpringBoot服务开启后通过端口访问无反应的解决

    2022-12-11 03:57:17
  • 在当前Activity之上创建悬浮view之WindowManager悬浮窗效果

    2023-02-09 21:02:12
  • C# 扩展方法的使用

    2022-04-05 14:46:24
  • JDK常用命令jps jinfo jstat的具体说明与示例

    2021-08-09 16:03:30
  • 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
  • Java正则之贪婪匹配、惰性匹配

    2022-08-14 16:41:23
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法

    2021-07-07 22:59:06
  • Android提高之使用NDK把彩图转换灰度图的方法

    2023-07-22 02:00:07
  • Android开发自学笔记(二):工程文件剖析

    2021-09-08 11:12:56
  • Java中的synchronized关键字

    2023-07-28 18:39:26
  • Android框架Volley使用:ImageRequest请求实现图片加载

    2022-03-01 11:30:06
  • 关于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
  • Android开发中WebView的简单使用小结

    2022-09-11 00:22:43
  • Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解

    2023-02-01 16:23:30
  • asp之家 软件编程 m.aspxhome.com