一、Spring
(一)什么是 Spring 框架
- Spring 是一款开源框架,用于解决企业开发的复杂性。
- 提供了两个核心技术:
- IOC(控制反转):把创建对象的权力交给 Spring 框架,由其创建并管理对象的生命周期。
- AOP(面向切面编程):在不改变源码的基础上对代码进行扩展。
 
- Spring 框架的特点:
- 方便解耦,简化开发。
- 支持 AOP 编程,便于扩展源码。
- 支持声明式事务。
- 方便集成各种优秀框架,如 mybatis、hibernate、mybatis-plus 等。
- 方便程序测试,提供了自己的单元测试。
 
(二)为什么使用 Spring 框架
在传统的编程中,类与类之间耦合性高,可维护性差。例如,之前 AController 和 BController 类中直接创建 MySqlDao 对象,如果后期数据库升级为 Oracle,需要在众多依赖 MySqlDao 的类中修改代码,工作量巨大。使用工厂模式和接口可以在一定程度上解决这种耦合,但 Spring 框架提供的 IOC 模式能更全面地完成类的创建以及类与类之间的依赖管理。
(三)什么是 IOC
- 概念
- IOC(Inversion of Control,控制反转)是面向对象编程中的一种设计原则,用于降低计算机代码之间的耦合度。常见的方式是依赖注入(Dependency Injection,简称 DI),还有依赖查找(Dependency Lookup)。IOC 就是由 Spring 容器创建对象并管理对象的生命周期,而 DI 是 Spring 自动注入类所依赖的属性。
 
- 实现 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();
   }
}- 获取 bean 的方式
- 根据 id 获取 bean 对象 :如上述测试代码中app.getBean("t"),但需要强制转换,可能出现数据安全问题。
- 根据反射类获取 bean 对象 :如app.getBean(Teacher.class),当容器中有多个该类型对象时无法获取到指定对象。
- 根据 id 和反射类获取 bean 对象 :如app.getBean("t", Teacher.class),是推荐的获取方式。
 
- 根据 id 获取 bean 对象 :如上述测试代码中
- 使用注解完成 bean 的创建
- Spring 提供了注解方式来创建 bean,常用注解有:
- @Controller:用于控制层类上。
- @Service:用于业务层类。
- @Repository:用于 mapper 层类。这三个注解底层都是 @Component,只是用于区分不同层的类。例如:
 
 
- Spring 提供了注解方式来创建 bean,常用注解有:
            
            
              java
              
              
            
          
          @Controller
public class UserController {
   //类的内容
}
@Service
public class UserService {
   //类的内容
}
@Repository
public class MySqlUserDao {
   //类的内容
}- bean 的作用域
- Spring 提供了四种作用域:
- singleton(单例):Spring 只创建一次对象,是默认的作用域。例如:
 
 
- 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 依赖注入
- 概念
- DI(Dependency Injection)依赖注入,就是给对象中的属性注入相应的值。IOC 控制反转的目的是降低程序耦合,削减依赖关系,依赖关系的管理交给 Spring 维护,这就是依赖注入。当当前类需要用到其他类的对象时,由 Spring 提供,只需在配置文件中说明依赖关系。
 
- 注入方式
- 通过 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;
   //类的其他内容
}- 使用注解完成注入关系
- 除了 @Autowired 注解,还有其他注解可用于完成注入关系,具体根据不同的场景和需求选择合适的注解方式。
 
二、总结
Spring 框架在企业开发中具有重要地位,通过 IOC 和 DI 等特性有效地解决了类与类之间的耦合问题,方便了开发、测试和集成其他框架。理解和掌握 Spring 框架的这些核心概念和技术,对于提升开发效率和软件质量至关重要。后续还需要进一步学习 SSM 整合,了解 Spring MVC 在接受客户请求及响应、Spring 在类创建及依赖管理、MyBatis 在数据库操作方面是如何协同工作的。