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

相关推荐
To Be Clean Coder16 分钟前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
手揽回忆怎么睡24 分钟前
Streamlit学习实战教程级,一个交互式的机器学习实验平台!
人工智能·学习·机器学习
xiaoxiaoxiaolll28 分钟前
《Advanced Materials》基于MXene的复合纤维实现智能纺织品多模态功能集成
学习
weixin199701080161 小时前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
cike_y1 小时前
Spring-Bean的作用域&Bean的自动装配
java·开发语言·数据库·spring
斯普信云原生组2 小时前
Redis 阈值超限及影响分析
redis·spring·bootstrap
db_murphy2 小时前
学习篇 | 英方i2Active和i2Stream工具了解
学习
强子感冒了2 小时前
Java学习笔记:String、StringBuilder与StringBuffer
java·开发语言·笔记·学习
想要一只奶牛猫3 小时前
Spring Web MVC(三)
前端·spring·mvc
BullSmall3 小时前
Doris的备份及恢复方案
学习