一、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 版本为例)。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
- 配置文件(以 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 类):
public class Teacher {
public void show() {
System.out.println("Teacher show()");
}
}
- 测试:
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,常用注解有:
@Controller
public class UserController {
//类的内容
}
@Service
public class UserService {
//类的内容
}
@Repository
public class MySqlUserDao {
//类的内容
}
- bean 的作用域
- Spring 提供了四种作用域:
- singleton(单例):Spring 只创建一次对象,是默认的作用域。例如:
- Spring 提供了四种作用域:
@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>
标签注入值,例如:
<bean id="t2" class="com.ddd.Teacher">
<constructor - arg name="name" value="李四"/>
<constructor - arg name="age" value="19"/>
</bean>
- 自动注入:使用 @Autowired 注解,先按照类型匹配,再按照 id 匹配。例如在 UserService 类中:
@Service
public class UserService {
@Autowired
private UserDao userDao;
//类的其他内容
}
- 使用注解完成注入关系
- 除了 @Autowired 注解,还有其他注解可用于完成注入关系,具体根据不同的场景和需求选择合适的注解方式。
二、总结
Spring 框架在企业开发中具有重要地位,通过 IOC 和 DI 等特性有效地解决了类与类之间的耦合问题,方便了开发、测试和集成其他框架。理解和掌握 Spring 框架的这些核心概念和技术,对于提升开发效率和软件质量至关重要。后续还需要进一步学习 SSM 整合,了解 Spring MVC 在接受客户请求及响应、Spring 在类创建及依赖管理、MyBatis 在数据库操作方面是如何协同工作的。