Spring款框架详解(宝藏级)中

简介: Spring款框架详解(宝藏级)

二,AOP


  • AOP目标
  • 让我们专注于业务功能处理
  • AOP原理
  • 将复杂的需求分解出不同方面,将不同对象、不同模块之间的共同业务集中解决
  • 通过动态代理的方式,把抽离出来的共性代码"织入"到业务代码中,实现对原有代码的增强处理


如图

47689e17bdb6da0db32d08e0bb1102b7_d23c54c00e6e4a3bafe7a324fc0e0c83.png


  • AOP相关术语
  • Aspect(切面)
  • Advice(增强处理)
  • Pointcut(切入点)
  • Join Point(连接点)
  • Target Object(目标对象)
  • AOP proxy(AOP 代理)
  • Weaving(织入)


定义切入点

切入点:简单来说,就是连接点的查询条件


<aop:config>
        <aop:pointcut id="loggerPointcut"
                      expression="execution(public void print(..))"/>
        <aop:aspect ref="sysLogger">
        </aop:aspect>
    </aop:config>


表达式匹配规则举例


expression="execution(public void print(..))"/>


  • 各种增强
增强类型 特点
Before 前置增强处理,在目标方法前织入增强处理
AfterReturning 后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理
AfterThrowing 异常增强处理,在目标方法抛出异常后织入增强处理
After 最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理
Around 环绕增强处理,在目标方法的前后都可以织入增强处理。可以控制目标方法是否执行


织入增强处理

织入:在切入点插入增强处理


3482b7c3470539222501943ba5520f16_0276c584103c4f43bc7b56e4eb6543c9.png


  • 演示:创建实体类添加增强方法
package com.xinxi2.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component()
public class LoggerAdvic {
    @Before("execution(public void wprk())")
    public void before(JoinPoint jp){
        System.out.println("前缀增强");
    }
    @AfterReturning("execution(public void wprk())")
    public void retuRning(JoinPoint jp){
        System.out.println("后置增强");
    }
    @AfterThrowing("execution(public void wprk())")
    public void afterException(JoinPoint jp){
        System.out.println("异常增强");
    }
    @Around("execution(public void wprk())")
    public Object around(ProceedingJoinPoint pjp){
        Object result = null;
        try {
            System.out.println("--------------------");
            result = pjp.proceed(); // 执行方法
            System.out.println("********************");
        }catch (Throwable e){
            e.printStackTrace();
        }
        System.out.println("环绕增强");
        return result;
    }
    @After("execution(public void wprk())")
    public void after(JoinPoint jp){
        System.out.println("最终增强");
    }
}


  • 在applicationContext.xml中写aop:config标签



<aop:config>
        <aop:pointcut id="loggerPointcut"
                      expression="execution(public void print(..))"/>
        <aop:aspect ref="sysLogger">
            <aop:before method="beforeLogger" pointcut-ref="loggerPointcut"></aop:before>
            <aop:after-returning method="afterReturning" pointcut-ref="loggerPointcut" returning="obj"></aop:after-returning>
            <aop:after-throwing method="afterException" pointcut-ref="loggerPointcut" throwing="e"></aop:after-throwing>
            <aop:around method="around" pointcut-ref="loggerPointcut" ></aop:around>
            <aop:after method="after" pointcut-ref="loggerPointcut"></aop:after>
        </aop:aspect>
    </aop:config>


解释以上几种增强方法

异常抛出增强


  • 特点
  • 在目标对象方法抛出异常时织入增强处理
  • 可灵活拔插的异常处理方案
<aop:config>
        <aop:pointcut id="loggerPointcut"
                      expression="execution(public void print(..))"/>
        <aop:aspect ref="sysLogger">
<!--      异常增强      -->
            <aop:after-throwing method="afterException" pointcut-ref="loggerPointcut" throwing="e"></aop:after-throwing>
        </aop:aspect>
    </aop:config>


最终增强


  • 特点
  • 无论方法正常运行还是抛出异常,都会在目标方法最后织入增强处理,即:该增强都会得到执行
  • 与Java中finally代码块的作用相似,通常用于释放资源
  • 可灵活拔插
<aop:config>
        <aop:pointcut id="loggerPointcut"
                      expression="execution(public void print(..))"/>
        <aop:aspect ref="sysLogger">
<!--      最终增强      -->
            <aop:after method="after" pointcut-ref="loggerPointcut"></aop:after>
        </aop:aspect>
    </aop:config>


环绕增强


  • 特点
  • 目标方法前后都可织入增强处理
  • 可获取或修改目标方法的参数、返回值
  • 可对目标方法进行异常处理,甚至可以决定目标方法是否执行
<aop:config>
        <aop:pointcut id="loggerPointcut"
                      expression="execution(public void print(..))"/>
        <aop:aspect ref="sysLogger">
        <!-- 环绕增强 -->
            <aop:around method="around" pointcut-ref="loggerPointcut" ></aop:around>
        </aop:aspect>
    </aop:config>


构造注入


  • 可以使用带参构造
  • Spring通过构造方法为属性赋值的一种注入方式
  • 可以在对象初始化时对属性赋值,具有良好的时效性
<bean id="daodao" class="com.xinxi2.bean.TSysUser">
        <constructor-arg name="acccunt" value="王某某"></constructor-arg>
        <constructor-arg name="address" value="王某"></constructor-arg>
    </bean>


P命名的注入

使用属性而不是子元素的形式配置Bean的属性


<bean id="唯一标识" class="类的全路径"
  p:"属性1"="注入的值" p:"属性2"="注入的值"  />
<bean id="唯一标识" class="类的全路径"
  p:属性-ref="注入的Bean" />


配置文件中使用p命名空间时,需要先添加p命名空间的声明

xmlns:p=“http://www.springframework.org/schema/p


相关文章
|
3天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
3天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
7天前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
37 1
|
11天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
36 2
|
12天前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
47 2
|
13天前
|
JavaScript 前端开发 Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
31 0
|
17天前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
20 0
|
17天前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
46 0
|
17天前
|
Java Spring 人工智能
AI 时代浪潮下,Spring 框架异步编程点亮高效开发之路,你还在等什么?
【8月更文挑战第31天】在快节奏的软件开发中,Spring框架通过@Async注解和异步执行器提供了强大的异步编程工具,提升应用性能与用户体验。异步编程如同魔法,使任务在后台执行而不阻塞主线程,保持界面流畅。只需添加@Async注解即可实现方法的异步执行,或通过配置异步执行器来管理线程池,提高系统吞吐量和资源利用率。尽管存在线程安全等问题,但异步编程能显著增强应用的响应性和效率。
28 0
|
17天前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
26 0