[原创]spring及springmvc精简版--AOP

本文通过实战案例详细解析了Spring AOP的工作原理及其配置方式,包括如何利用AOP进行日志记录等横切关注点的处理,展示了前置、后置、异常、返回和环绕通知的应用。

接上一篇:[原创]spring及springmvc精简版--IOC

理解AOP。java是一种面向对象的语言。而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配

       经典例子,很多系统都有日志。以登录为例子。常规编程流程大致如下:点击登录--->写入日志--->后台处理--->写入日志。因为我们的系统中会有很多功能逻辑代码都是如此去处理日志。假设有一天,需求改变不需要日志了。那么我们如何去处理这些已经存在于整体逻辑单元中的日志代码?无非是找到每一个使用日志的地方,逐一删除。大家可想这样的效率?代码的耦合度?

      而AOP变成。就是为了高度的解耦儿产生。它将登录的整个流程进行按照特定的,共同的业务逻辑进行切割,从而抽象出来了一组公共的逻辑单元。然后在根据不同业务模块的需求,在某些业务指定的地方将公共的业务逻辑植入其中,从而形成了一个整体的业务逻辑单元,实现某一模块功能。(这些是自己思考,总结的,刚开始接触的时候,没有理解到这点,也吃了很多闭门羹)有了这样的认识和理解,我们理解spring AOP中的一些常用的概念就很简单:

    横切关注点:哪些业务需要拦截,拦截后干什么?

          切面:若干个横切关注点的抽象结合。即:抽象出来的公共的业务逻辑单元

        连接点:需要拦截的业务。原本剩下的业务逻辑

          切入点:连接点的表达式。和通知相似。

     通知:将共同的逻辑代码植入的提示。前置,后置,异常,返回,环绕。

 

1.applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
 9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
10         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
11     <!-- 
12     <bean id="person" class="com.bean2.Person">
13         <constructor-arg value="12" type="int"></constructor-arg>
14     </bean>
15      -->
16     
17     <bean id="myMath" class="com.bean2.MyMath"></bean>
18     
19     <bean id="mylog" class="com.bean2.Log"></bean>
20     <!-- aop配置 -->
21     <aop:config>
22         <!--配置切入点
23             * com.bean.person.*(..):person类中的所有方法
24             * com.bean.*.*(..) bean包里的所有类的所有犯法
25             * com.bean.person.add*(int,int) :person 类中以add开头的方法,并且参数是两个int值
26         -->
27         <aop:pointcut expression="execution(* com.bean2.MyMath.*(..))" id="pc"/>
28         <!-- 切面 -->
29         <aop:aspect ref="mylog">
30         <!-- 通知 
31         <aop:before method="beforelog" pointcut-ref="pc"/>
32             <aop:after method="afterlog" pointcut-ref="pc" />
33             <aop:after-returning method="returnLog" pointcut-ref="pc" returning="o"/>
34             <aop:after-throwing method="throwLog" pointcut-ref="pc" throwing="e"/>
35         -->
36             
37             <aop:around method="aroundLog" pointcut-ref="pc"/>
38         </aop:aspect>
39     </aop:config>
40 </beans>

 

 

2.Log

 1 package com.bean2;
 2 
 3 import java.util.Arrays;
 4 
 5 import org.aspectj.lang.JoinPoint;
 6 import org.aspectj.lang.ProceedingJoinPoint;
 7 
 8 public class Log {
 9 
10     public void beforelog(JoinPoint jp){
11         String methodName = jp.getSignature().getName();
12         Object[] os = jp.getArgs();
13         System.out.println("正在运行"+methodName+"方法,参数是:"+Arrays.asList(os));
14     }
15     public void afterlog(JoinPoint jp){
16         String methodName = jp.getSignature().getName();
17         System.out.println(methodName+"方法运行完");
18     }
19     public void returnLog(JoinPoint jp,Object o){
20         String methodName = jp.getSignature().getName();
21         System.out.println(methodName+"方法的返回结果是:"+o);
22     }
23     public void throwLog(JoinPoint jp,Throwable e){
24         String methodName = jp.getSignature().getName();
25         System.out.println(methodName+"方法发生了异常,异常信息是:"+e.getMessage());
26     }
27     
28     public void aroundLog(ProceedingJoinPoint jp){
29         String methodName =  jp.getSignature().getName();
30         Object[] os = jp.getArgs();
31         //前置
32         System.out.println("正在运行"+methodName+"方法,参数是:"+Arrays.asList(os));
33         //执行目标对象
34         try {
35             Object result = jp.proceed();
36             //返回
37             System.out.println(methodName+"方法的返回结果是:"+result);
38         } catch (Throwable e) {
39             // TODO Auto-generated catch block
40             e.printStackTrace();
41             //异常
42             System.out.println(methodName+"方法发生了异常,异常信息是:"+e.getMessage());
43         }finally{
44             //后置通知
45             System.out.println(methodName+"方法运行完");
46         }
47     }
48 }

 

 

3.MyMath

 1 package com.bean2;
 2 
 3 public class MyMath {
 4 
 5     public int add(int num1,int num2){
 6         
 7         int result = num1+num2;
 8         return result;
 9     }
10     public int sub(int num1,int num2){
11         //System.out.println("正在运行sub方法,参数是:"+num1+","+num2);
12         int result = num1-num2;
13         
14         //System.out.println("sub方法运行完,结果是:"+result);
15         return result;
16     }
17     public int div(int num1,int num2){
18         int result = num1/num2;
19         return result;
20     }
21     public int mul(int num1,int num2){
22         int result = num1*num2;
23         return result;
24     }
25 }

 

 

4.Person

 1 package com.bean2;
 2 
 3 public class Person {
 4 
 5     private double num1;
 6     private int num2;
 7     
 8     
 9     public Person(double num){
10         System.out.println("double");
11         this.num1 = num;
12     }
13     public Person(int num){
14         System.out.println("int");
15         this.num2 = num;
16     }
17     public void show(){
18         System.out.println(num1+","+num2);
19         
20     }
21     
22 }

 

转载于:https://www.cnblogs.com/jasonHome/p/6670213.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值