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 在数据库操作方面是如何协同工作的。

相关推荐
知识分享小能手40 分钟前
Vue3 学习教程,从入门到精通,使用 VSCode 开发 Vue3 的详细指南(3)
前端·javascript·vue.js·学习·前端框架·vue·vue3
pay4fun1 小时前
2048-控制台版本
c++·学习
找不到、了2 小时前
Spring的Bean原型模式下的使用
java·spring·原型模式
超级小忍2 小时前
Spring AI ETL Pipeline使用指南
人工智能·spring
知识分享小能手2 小时前
Bootstrap 5学习教程,从入门到精通,Bootstrap 5 表单验证语法知识点及案例代码(34)
前端·javascript·学习·typescript·bootstrap·html·css3
巴伦是只猫3 小时前
【机器学习笔记 Ⅲ】4 特征选择
人工智能·笔记·机器学习
不爱说话的采儿3 小时前
UE5详细保姆教程(第四章)
笔记·ue5·游戏引擎·课程设计
weixin_418813873 小时前
Python-可视化学习笔记
笔记·python·学习
Haoea!3 小时前
Flink-05学习 接上节,将FlinkJedisPoolConfig 从Kafka写入Redis
学习·flink·kafka
Vic101014 小时前
Java 开发笔记:多线程查询逻辑的抽象与优化
java·服务器·笔记