深入浅出 Spring:核心概念和基本用法详解

这篇具有很好参考价值的文章主要介绍了深入浅出 Spring:核心概念和基本用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深入浅出 Spring:核心概念和基本用法详解,Java,spring,数据库,java

个人主页:17_Kevin-CSDN博客

收录专栏;《Java》


一、引言

在 Java 企业级应用开发中,Spring 框架已经成为了事实上的标准。它提供了一种轻量级的解决方案,使得开发者能够更轻松地构建灵活、可扩展的应用程序。在本文中,我们将探讨 Spring 框架的一些核心概念和基本用法,以此更好地理解和使用 Spring 进行开发。

二、依赖注入(DI)

在 Spring 中,依赖注入是一种设计模式,用于将对象之间的依赖关系解耦。它通过将依赖对象的创建和管理交给 Spring 容器来实现。这样,开发人员只需要关注业务逻辑,而不需要关心对象的创建和装配过程。

例如,在上面的学生管理系统中,我们可以使用依赖注入来注入学生服务对象到控制器中。通过在控制器的构造函数中添加学生服务对象作为参数,Spring 容器会在创建控制器实例时自动注入相应的学生服务对象。

public class StudentController {
    private final StudentService studentService;

    // 使用构造函数注入学生服务对象
    public StudentController(StudentService studentService) {
        this.studentService = studentService;
    }

    // 处理学生列表请求的方法
    @GetMapping("/students")
    public List<Student> listStudents() {
        return studentService.listAllStudents();
    }

    // 处理学生详情请求的方法
    @GetMapping("/students/{studentId}")
    public Student getStudent(@PathVariable int studentId) {
        return studentService.getStudentById(studentId);
    }

    // 处理学生创建请求的方法
    @PostMapping("/students")
    public void createStudent(@RequestBody Student student) {
        studentService.createStudent(student);
    }

    // 处理学生更新请求的方法
    @PutMapping("/students/{studentId}")
    public void updateStudent(@PathVariable int studentId, @RequestBody Student student) {
        studentService.updateStudent(studentId, student);
    }

    // 处理学生删除请求的方法
    @DeleteMapping("/students/{studentId}")
    public void deleteStudent(@PathVariable int studentId) {
        studentService.deleteStudent(studentId);
    }
}

在上述代码中,我们通过构造函数注入了学生服务对象到控制器中。这样,控制器就可以直接使用学生服务对象的方法来处理学生相关的请求。

三、控制反转(IOC)

除了依赖注入,Spring 还提供了控制反转的特性。控制反转是指将对象的控制权交给容器,而不是由对象自己来控制。在 Spring 中,容器负责创建和管理对象,以及将对象之间的依赖关系注入到相应的对象中。

例如,在上面的学生管理系统中,我们可以使用 Spring 的注解@Component将学生服务标注为一个 Spring 组件。这样,Spring 容器会在应用启动时自动创建学生服务对象,并将其注入到需要它的对象中。

// 学生服务接口
public interface StudentService {
    // 获取所有学生的方法
    List<Student> listAllStudents();

    // 获取指定学生的方法
    Student getStudentById(int studentId);

    // 创建学生的方法
    void createStudent(Student student);

    // 更新学生的方法
    void updateStudent(int studentId, Student student);

    // 删除学生的方法
    void deleteStudent(int studentId);
}

// 学生服务实现类
@Component
public class StudentServiceImpl implements StudentService {
    // 学生列表
    private List<Student> students = new ArrayList<>();

    // 获取所有学生的方法
    @Override
    public List<Student> listAllStudents() {
        return students;
    }

    // 获取指定学生的方法
    @Override
    public Student getStudentById(int studentId) {
        return students.stream()
                .filter(student -> student.getId() == studentId)
                .findFirst()
                .orElse(null);
    }

    // 创建学生的方法
    @Override
    public void createStudent(Student student) {
        students.add(student);
    }

    // 更新学生的方法
    @Override
    public void updateStudent(int studentId, Student student) {
        students.stream()
                .filter(student1 -> student1.getId() == studentId)
                .findFirst()
                .ifPresentOrElse(
                        student1 -> {
                            student1.setName(student.getName());
                            student1.setAge(student.getAge());
                        },
                        () -> {
                            throw new RuntimeException("未找到要更新的学生");
                        }
                );
    }

    // 删除学生的方法
    @Override
    public void deleteStudent(int studentId) {
        students.removeIf(student -> student.getId() == studentId);
    }
}

在上述代码中,我们使用@Component注解将学生服务实现类标注为一个 Spring 组件。这样,Spring 容器会在应用启动时自动创建学生服务对象,并将其注入到需要它的对象中。

四、AOP

除了依赖注入和控制反转,Spring 还提供了面向切面编程(AOP)的支持。AOP 允许我们将横切关注点(如日志记录、性能监控、事务管理等)与业务逻辑分离,从而提高代码的可维护性和可扩展性。

例如,在上面的学生管理系统中,我们可以使用 Spring 的 AOP 来添加日志记录功能。具体来说,我们可以创建一个日志切面类,并在其中添加日志记录的代码。然后,我们可以使用 Spring 的@Aspect注解将日志切面类标注为一个 Spring 组件,并使用@Pointcut注解指定要在哪些方法上应用日志记录。

// 日志切面类
@Aspect
@Component
public class LoggingAspect {
    // 记录日志的方法
    @Before("execution(* com.example.springstudent.service..*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法 " + className + "." + methodName + " 被调用");
    }

    // 记录日志的方法
    @After("execution(* com.example.springstudent.service..*.*(..))")
    public void logAfterMethod(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法 " + className + "." + methodName + " 执行完毕");
    }
}

在上述代码中,我们使用@Component注解将日志切面类标注为一个 Spring 组件。然后,我们使用@Aspect注解将日志切面类标注为一个 Spring 切面。在@Pointcut注解中,我们指定要在所有学生服务接口和实现类的方法上应用日志记录。在@Before注解中,我们添加了一个前置通知,用于在方法执行之前记录日志。在@After注解中,我们添加了一个后置通知,用于在方法执行完毕后记录日志。

五、总结

通过本文,我们了解了 Spring 框架的一些核心概念和基本用法。Spring 提供了一种轻量级的解决方案,使得开发企业级应用程序更加简单和高效。

感谢您的阅读,希望这篇博客对你有所帮助。


 

I'm Kevin, and we'll see you in the next blog

深入浅出 Spring:核心概念和基本用法详解,Java,spring,数据库,java文章来源地址https://www.toymoban.com/news/detail-841703.html

到了这里,关于深入浅出 Spring:核心概念和基本用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析Spring基本概念和核心思想

    使用spring后,被spring管理的类,不需要再new。 要想类被spring管理,则需要通过bean的方式,把类引入到spirng的配置文件中。 Ioc容器 简单的理解就是: 实现IoC思想,并提供对象创建,对象装配以及对象生命周期管理的软件就是Ioc容器 IoC理解 应用程序无需主动new对象,而是描述

    2024年02月12日
    浏览(35)
  • 深入浅出解析Stable Diffusion完整核心基础知识 | 【算法兵器谱】

    Rocky Ding 公众号:WeThinkIn 最新更新: Rocky也一直在更新Stable Diffusion系列的文章内容,包括最新发布的Stable Diffusion XL。Rocky都进行了全方位的深入浅出的解析, 码字真心不易,希望大家能给Rocky正在撰写更新的下面两篇文章多多点赞,万分感谢: 深入浅出完整解析Stable Diffus

    2024年02月10日
    浏览(28)
  • 深入浅出Spring AOP

    第1章:引言 大家好,我是小黑,咱们今天要聊的是Java中Spring框架的AOP(面向切面编程)。对于程序员来说,理解AOP对于掌握Spring框架来说是超级关键的。它像是魔法一样,能让咱们在不改变原有代码的情况下,给程序增加各种功能。 AOP不仅仅是一个编程范式,它更是一种思

    2024年01月20日
    浏览(42)
  • 【大虾送书第七期】深入浅出SSD:固态存储核心技术、原理与实战

    目录  ✨写在前面   ✨内容简介  ✨作者简介  ✨名人推荐  ✨文末福利      🦐博客主页:大虾好吃吗的博客      🦐专栏地址:免费送书活动专栏地址         近年来国家大力支持半导体行业,鼓励自主创新,中国SSD技术和产业良性发展,产业链在不断完善,与

    2024年02月10日
    浏览(39)
  • 深入浅出推荐系统(一):推荐系统基本架构

    过去八九年在广告、生活服务、电商等领域从事大数据及推荐系统相关工作,近来打算对过去的工作做一个系统性的梳理。一方面帮自己查缺补漏、进行更深入的学习;另一方面也希望能通过博客结交同好,增进交流。 这一博客系列以介绍推荐系统为主,会少量涉及广告系统

    2023年04月26日
    浏览(43)
  • MySQL深入浅出:自增长序列(@i:=@i+1)的用处及用法

    目录 1:问题分析 2:模拟自增长序列 2.1 单表查询 2.2   多表关联查询 3:结束语 社区 Oracle中 的 伪列 ROWNUM 是一组递增的序列 ,在查询数据时生成,为结果集中每一行标识一个行号, 每条记录会因为输出的顺序不同而获得不同的逻辑编号; 此自增长序列可以视作起始值为

    2024年02月09日
    浏览(36)
  • 动力节点|深入浅出Vue框架学习教程,带你快速掌握前端开发核心技能

    Vue是一款流行的JavaScript前端框架,最初由华人开发者尤雨溪创建,并在GitHub上开源发布,它采用MVVM模型的设计思维,专注于UI项目的开发,能够方便地组织和管理页面上的各个组件,大大提高了前端开发的效率。 同时,Vue也具有高度的灵活性和可定制性,使得其在快速开发

    2024年02月13日
    浏览(36)
  • 深入浅出hdfs-hadoop基本介绍

    一、Hadoop基本介绍 hadoop最开始是起源于Apache Nutch项目,这个是由Doug Cutting开发的开源网络搜索引擎,这个项目刚开始的目标是为了更好的做搜索引擎,后来Google 发表了三篇未来持续影响大数据领域的三架马车论文: Google FileSystem、BigTable、Mapreduce开始掀起来了大数据的浪潮

    2024年01月24日
    浏览(37)
  • 在疯狂三月之后,深入浅出分析AIGC的核心价值 (下篇)|【AI行研&商业价值分析】

    Rocky Ding 公众号:WeThinkIn 【AI行研商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的优化建议,一起交流学习💪 大家好,我是Rocky。 本文是《在疯狂三月之后,深入浅出分析AIGC的核心价值》系列的第二篇文章,在第一篇文章中,我

    2024年02月16日
    浏览(29)
  • 在疯狂三月之后,深入浅出分析AIGC的核心价值 (上篇)|【AI行研&商业价值分析】

    Rocky Ding WeThinkIn 【AI行研商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的优化建议,一起交流学习💪 大家好,我是Rocky。 2023年3月21日,微软创始人比尔·盖茨在其博客文章《The Age of AI has begun》中表示, 自从1980年首次看到图形用

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包