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

相关推荐
像污秽一样23 分钟前
简易记事本开发-(SSM+Vue)
java·vue.js·spring boot·spring·servlet·maven·mybatis
Bug.ink25 分钟前
Linux学习——9_Ubuntu Linux操作系统
linux·学习·ubuntu
殇淋狱陌1 小时前
第三章 列表(List)语法讲解
数据结构·python·学习·数据分析·list
九月镇灵将2 小时前
当你爬着数据,程序突然报JSON格式化异常...(论如何修复异常的JSON)
python·学习·json
m0_689618282 小时前
敏捷多模态微型机器人:独特的被动变形轮设计
笔记·机器人
庸不易3 小时前
Spring Data
java·后端·spring
秋意钟3 小时前
@Resource与@Autowire
spring
-self-disciplinese3 小时前
从零开始学Java,学习笔记Day24
java·笔记·后端·学习
赵利伟@3 小时前
springboot 配置logback-spring.xml,配置日志只保留7天数据,滚动更新
spring boot·spring·logback