Spring框架学习笔记

一、Spring

(一)什么是 Spring 框架

  1. Spring 是一款开源框架,用于解决企业开发的复杂性。
  2. 提供了两个核心技术:
    • IOC(控制反转):把创建对象的权力交给 Spring 框架,由其创建并管理对象的生命周期。
    • AOP(面向切面编程):在不改变源码的基础上对代码进行扩展。
  3. Spring 框架的特点:
    • 方便解耦,简化开发。
    • 支持 AOP 编程,便于扩展源码。
    • 支持声明式事务。
    • 方便集成各种优秀框架,如 mybatis、hibernate、mybatis-plus 等。
    • 方便程序测试,提供了自己的单元测试。

(二)为什么使用 Spring 框架

在传统的编程中,类与类之间耦合性高,可维护性差。例如,之前 AController 和 BController 类中直接创建 MySqlDao 对象,如果后期数据库升级为 Oracle,需要在众多依赖 MySqlDao 的类中修改代码,工作量巨大。使用工厂模式和接口可以在一定程度上解决这种耦合,但 Spring 框架提供的 IOC 模式能更全面地完成类的创建以及类与类之间的依赖管理。

(三)什么是 IOC

  1. 概念
    • IOC(Inversion of Control,控制反转)是面向对象编程中的一种设计原则,用于降低计算机代码之间的耦合度。常见的方式是依赖注入(Dependency Injection,简称 DI),还有依赖查找(Dependency Lookup)。IOC 就是由 Spring 容器创建对象并管理对象的生命周期,而 DI 是 Spring 自动注入类所依赖的属性。
  2. 实现 Spring 的 IOC 功能步骤
    • 引入 Spring 依赖:例如在 pom.xml 中添加如下依赖(以 5.2.15.RELEASE 版本为例)。
XML 复制代码
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.2.15.RELEASE</version>
</dependency>
  • 配置文件(以 XML 方式为例)
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
   <!--把Teacher对象交给spring管理,bean表示一个对象,id是bean的唯一标识,class是要创建对象的全类名-->
   <bean id="t" class="com.lyk.Teacher"></bean>
</beans>
  • 创建一个类(如 Teacher 类)
java 复制代码
public class Teacher {
   public void show() {
      System.out.println("Teacher show()");
   }
}
  • 测试
java 复制代码
public class Test01 {
   public static void main(String[] args) {
      //获取spring容器
      ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
      //从容器中获取指定的对象(根据id获取,需要强制转换,可能有数据安全问题)
      Teacher teacher = (Teacher) app.getBean("t");
      teacher.show();
      //根据反射类获取bean对象(如果容器中存在多个该类型的对象时无法拿到)
      Teacher teacher2 = app.getBean(Teacher.class);
      teacher2.show();
      //根据id和反射类获取bean对象(推荐方式)
      Teacher teacher3 = app.getBean("t", Teacher.class);
      teacher3.show();
   }
}
  1. 获取 bean 的方式
    • 根据 id 获取 bean 对象 :如上述测试代码中app.getBean("t"),但需要强制转换,可能出现数据安全问题。
    • 根据反射类获取 bean 对象 :如app.getBean(Teacher.class),当容器中有多个该类型对象时无法获取到指定对象。
    • 根据 id 和反射类获取 bean 对象 :如app.getBean("t", Teacher.class),是推荐的获取方式。
  2. 使用注解完成 bean 的创建
    • Spring 提供了注解方式来创建 bean,常用注解有:
      • @Controller:用于控制层类上。
      • @Service:用于业务层类。
      • @Repository:用于 mapper 层类。这三个注解底层都是 @Component,只是用于区分不同层的类。例如:
java 复制代码
@Controller
public class UserController {
   //类的内容
}

@Service
public class UserService {
   //类的内容
}

@Repository
public class MySqlUserDao {
   //类的内容
}
  1. bean 的作用域
    • Spring 提供了四种作用域:
      • singleton(单例):Spring 只创建一次对象,是默认的作用域。例如:
java 复制代码
@Component
@Scope("singleton")
public class Docter {
   public void print() {
      System.out.println("医生");
   }
}
  • prototype(多例):每次获取 bean 时都会创建新的实例,如@Scope("prototype")
  • request:每次 http 请求都会创建一个 bean,仅适用于 web 环境。
  • session:同一个 http session 共享一个 bean 实例,仅适用于 web 环境。

(四)DI 依赖注入

  1. 概念
    • DI(Dependency Injection)依赖注入,就是给对象中的属性注入相应的值。IOC 控制反转的目的是降低程序耦合,削减依赖关系,依赖关系的管理交给 Spring 维护,这就是依赖注入。当当前类需要用到其他类的对象时,由 Spring 提供,只需在配置文件中说明依赖关系。
  2. 注入方式
    • 通过 set 方法注入:Spring 通过类中的 set 方法为属性注入值。
    • 通过构造方法注入值 :在 XML 配置文件中通过<constructor - arg>标签注入值,例如:
XML 复制代码
<bean id="t2" class="com.ddd.Teacher">
   <constructor - arg name="name" value="李四"/>
   <constructor - arg name="age" value="19"/>
</bean>
  • 自动注入:使用 @Autowired 注解,先按照类型匹配,再按照 id 匹配。例如在 UserService 类中:
java 复制代码
@Service
public class UserService {
   @Autowired
   private UserDao userDao;
   //类的其他内容
}
  1. 使用注解完成注入关系
    • 除了 @Autowired 注解,还有其他注解可用于完成注入关系,具体根据不同的场景和需求选择合适的注解方式。

二、总结

Spring 框架在企业开发中具有重要地位,通过 IOC 和 DI 等特性有效地解决了类与类之间的耦合问题,方便了开发、测试和集成其他框架。理解和掌握 Spring 框架的这些核心概念和技术,对于提升开发效率和软件质量至关重要。后续还需要进一步学习 SSM 整合,了解 Spring MVC 在接受客户请求及响应、Spring 在类创建及依赖管理、MyBatis 在数据库操作方面是如何协同工作的。

相关推荐
问心无愧051328 分钟前
ctf show web入门156
笔记
咸甜适中1 小时前
rust语言学习笔记Trait(八)Iterator(迭代器)
笔记·学习·rust
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【58】Spring AI Alibaba Builtin Nodes 模块介绍
java·人工智能·spring
小江的记录本1 小时前
【Java基础】反射与注解:核心原理、自定义注解、注解解析方式(附《思维导图》+《面试高频考点清单》)
java·数据结构·python·mysql·spring·面试·maven
华为云开发者联盟1 小时前
告别繁琐操作,华为云码道 + Docker重塑远程开发体验
人工智能·学习·docker·华为云·软件开发·华为云码道
Bechamz2 小时前
大数据开发学习Day38
大数据·学习
smileNicky2 小时前
Spring框架懒加载怎么实现?
python·spring·rpc
-To be number.wan2 小时前
计算机组成原理 | 原码一位乘法运算方法
学习·计算机组成原理
前端若水3 小时前
从零开始学习AI Agent的实战路线图
人工智能·学习
yychen_java3 小时前
IDEA × Qoder:告别“手写Spring”,进入AI协作开发新时代
人工智能·spring·intellij-idea