经验大分享: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的存在。

相关文章
Alibaba首著!12年Java经验终成Spring Cloud Alibaba微服务实战
今天给大家带来的是:《Spring Cloud Alibaba微服务实战》,号称Spring Cloud Alibaba首著12年Java开发及架构经验总结,40万学员认可的高效技术学习模型,内容涵盖场景→需求→解决方案→应用→原理
经验大分享:Spring基础篇——Spring容器和应用上下文理解
经验大分享:Spring基础篇——Spring容器和应用上下文理解
78 1
经验大分享:Spring实现AOP的三种方式
经验大分享:Spring实现AOP的三种方式
63 0
经验大分享:Spring实现AOP的三种方式
经验大分享:Spring实现AOP的三种方式
60 0
经验大分享:spring项目在启动的时候执行方法初始化
经验大分享:spring项目在启动的时候执行方法初始化
132 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
117 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
123 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
66 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
237 0
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
129 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问