经验大分享:Spring之旅(2)

简介: 经验大分享:Spring之旅(2)

作者:@houkai

本文为作者原创,转载请注明出处:

Spring简化Java的下一个理念:基于切面的声明式编程

3、应用切面

依赖注入的目的是让相互协作的组件保持松散耦合;而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

AOP面向切面编程被定义为促使应用程序分离关注点的一项技术。系统由许多不同的组件组成,每个组件除了负责某一特定的功能,还要承担额外的职责,诸如日志、事务管理和安全等等的服务经常融入到自身的核心业务逻辑中去,这些服务统称为横向关注点,因为它们总是跨越系统的各个组件。

将这些代码分散到多个组件,会导致双重复杂性:

如果要修改关注点得逻辑,必须修改各个组件的相关实现。即使你把这些关注点抽象成一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中(耦合);

组件代码会因为那些与自身核心业务无关的代码而变得混乱。

假设你需要使用吟游诗人这个服务类来记载骑士(BraveKnight)的所有事迹,建立Minstrel(吟游诗人)类。

?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package com.test.knights; public class Minstrel { public void singBeforeQuest() { System.out.println("Fa la la; The knight is so brave!"); } public void singAfterQuest() { System.out.println("Tee hee he; The brave knight do a quest"); }}//代码效果参考:http://www.ezhiqi.com/zx/art_1662.html package com.test.knights; public class BraveKnight implements Knight { private Quest quest; private Minstrel minstrel; public BraKnight(Quest quest, Minstrel minstrel) { this.quest = quest; this.minstrel = minstrel; } public void embrakOnQuest() throws QuestException { minstrel.singBeforeQuest(); quest.embrak(); minstrel.singAfterQuest(); }//代码效果参考:http://www.ezhiqi.com/bx/art_3253.html }//代码效果参考:http://www.ezhiqi.com/zx/art_3918.html<?xml version="1.0" encoding="UTF-8"?>

让我们做适当的调整来让BraveKnight来使用Minstrel

这样达到了预期的效果:骑士做任务前执行singBeforeQuest()方法、任务后执行singAfterQuest()方法。但是管理吟游诗人真的是骑士的责任吗?骑士在依赖注入时就必须提供一个吟游诗人,这显然是不合逻辑的。吟游诗人应该自己独立出来,他有自己分内的事情。

改进,把Minstrel抽象为一个切面,你所做是是在Spring配置文件中声明它。

这里将minstrel Bean声明为一个切面,pointcut定义了一类切入点embark,expression含义是在任意返回类型、任意对象调用方法、任意入参的embrakOnQuest 方法都有效。

称为前置通知,称为后置通知。从这个示例中获得两个重要的观点:

Minstrel仍然是一个POJO,没有任何代码表示它将被作为一个切面使用。

Minstrel可以被应用到BraveKnight中,而BraveKnight不需要显示地调用。实际上,BraveKnight完全不知道Minstrel的存在。

相关文章
|
4月前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
3月前
|
XML 安全 Java
经验大分享:Spring之旅(2)
经验大分享:Spring之旅(2)
18 0
|
3月前
|
IDE Java Maven
技术好文:spring
技术好文:spring
33 0
|
4月前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
112 6
Spring高手之路17——动态代理的艺术与实践
|
4月前
|
XML 前端开发 Java
起航Spring MVC:从零开始的环境搭建指南
起航Spring MVC:从零开始的环境搭建指南
40 0
起航Spring MVC:从零开始的环境搭建指南
|
4月前
|
XML Java 数据库连接
Spring基础入门详解与实践
Spring基础入门详解与实践
47 0
|
Kubernetes Cloud Native Java
重磅!程序员都在学的Spring实战(第6版),你竟然还没有掌握?
不知不觉已经年底了,可能很多程序员还在迷茫阶段,不知道该如何学习进步。 也因为疫情的缘故,都阳了!也可能因为被裁了,在家里面待着,除了刷剧就是看视频、玩游戏,也就都默默躺平了..... 殊不知,你该起来学习了,在躺平下去就真的废了,没有经济来源,没有工作,也就赶不上明年金三银四招聘旺季。
|
NoSQL JavaScript 前端开发
Spring Boot3.0升级,踩坑之旅,附解决方案(二)
Spring Boot3.0升级,踩坑之旅,附解决方案(二)
643 1
|
Oracle druid Java
Spring Boot3.0升级,踩坑之旅,附解决方案
Spring Boot3.0升级,踩坑之旅,附解决方案
1215 0
|
缓存 负载均衡 Java
Spring Boot 开发离不开这些注解,快来学习啦!
Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring 框架中的 AOP(面向切面编程)概念。