当前位置:首页 > 技术 > 正文内容

Spring框架核心特性解析:依赖注入、AOP、事务与配置管理

访客 技术 2026年10月5日 1

Spring框架通过其卓越的设计理念,极大地提升了企业级Java应用的开发效率与代码质量。以下深入探讨其四大核心机制及其在实际开发中的应用方式。

控制反转与依赖注入

依赖注入(DI)是Spring控制反转(IoC)容器的核心体现。通过将对象的实例化与依赖关系的绑定交由容器处理,开发者能够编写出低耦合、高内聚且易于单元测试的代码。推荐使用构造器注入来保证依赖的不可变性。


import org.springframework.stereotype.Service;

@Service
public class OrderProcessingService {
    
    private final InventoryDataAccess inventoryDataAccess;

    // 采用构造器注入,确保依赖在对象初始化时即被赋予且不可更改
    public OrderProcessingService(InventoryDataAccess inventoryDataAccess) {
        this.inventoryDataAccess = inventoryDataAccess;
    }

    public void processOrder(String orderId) {
        inventoryDataAccess.updateStock(orderId);
    }
}

在上述示例中,@Service 将类标记为业务逻辑层的Bean。Spring容器在实例化 OrderProcessingService 时,会自动寻找并注入 InventoryDataAccess 类型的Bean,无需手动使用 new 关键字创建依赖对象。

面向切面编程(AOP)

AOP机制允许开发者将日志记录、性能监控、权限校验等横切关注点从核心业务逻辑中剥离。这不仅保持了业务代码的纯粹性,还大幅提高了这些通用功能的复用率。


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ExecutionTimeTracker {
    
    // 使用环绕通知拦截特定包下的所有方法,记录执行耗时
    @Around("within(com.app.business..*)")
    public Object trackExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        
        // 执行目标方法
        Object result = joinPoint.proceed();
        
        long endTime = System.currentTimeMillis();
        System.out.println(joinPoint.getSignature() + " 耗时: " + (endTime - startTime) + "ms");
        
        return result;
    }
}

这里通过 @Aspect 定义切面,并利用 @Around 环绕通知配合 within 切入点指示符,实现了对 com.app.business 包及其子包下所有方法执行时间的无侵入式监控。

声明式事务管理

在数据库操作中,事务的边界控制至关重要。Spring的声明式事务允许开发者通过简单的注解来管理事务的开启、提交与回滚,彻底告别了繁琐的编程式事务代码。


import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;

@Service
public class AccountTransferService {
    
    private final AccountDao accountDao;

    public AccountTransferService(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    // 声明式事务,指定遇到任何Exception时均触发回滚
    @Transactional(rollbackFor = Exception.class)
    public void transferFunds(String fromAccount, String toAccount, BigDecimal amount) {
        accountDao.deductBalance(fromAccount, amount);
        accountDao.addBalance(toAccount, amount);
    }
}

通过在方法上添加 @Transactional,Spring会在方法执行前拦截并开启数据库事务,若方法正常结束则提交事务,若抛出 Exception 则自动回滚,确保了资金转移操作的原子性与一致性。

基于Java的现代化配置

早期的Spring重度依赖XML文件进行Bean定义,而现代Spring全面拥抱基于Java注解的配置方式。这种方式不仅具备编译时的类型安全检查,还能利用Java语言本身的逻辑控制能力来动态注册Bean。


import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class NotificationConfig {
    
    // 当配置文件中 notification.provider=email 时,注册邮件发送Bean
    @Bean
    @ConditionalOnProperty(name = "notification.provider", havingValue = "email")
    public MessageSender emailSender() {
        return new EmailMessageSender();
    }

    // 当配置文件中 notification.provider=sms 或未配置时,注册短信发送Bean
    @Bean
    @ConditionalOnProperty(name = "notification.provider", havingValue = "sms", matchIfMissing = true)
    public MessageSender smsSender() {
        return new SmsMessageSender();
    }
}

利用 @Configuration 和 @Bean 替代了传统的XML标签。结合 @ConditionalOnProperty 等条件注解,开发者可以根据外部环境变量或配置文件动态决定加载哪种实现类,使得配置逻辑更加灵活且高度内聚。

返回列表

上一篇:图片浏览与Tom猫动画实现

没有最新的文章了...

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。