Spring(1)基本概念+开发的基本步骤

一、Spring的基本概念

1)、Spring 框架简述

Spring 是轻量级、开源的 Java 企业级开发框架,核心设计理念是IoC(控制反转) 和AOP(面向切面编程),旨在简化 Java 开发、解耦业务组件、提升代码可维护性和扩展性。

它不替代现有技术,而是整合Servlet、MyBatis、Hibernate、RabbitMQ 等各类框架,成为 Java 后端开发的核心基础设施,几乎是企业级 Java 应用的标配。

核心优势:

解耦:无需手动管理对象依赖,由 Spring 容器统一创建、注入、管理

简化开发:封装大量通用逻辑,减少样板代码

生态完善:覆盖 Web、数据访问、消息、安全等全场景

无侵入:业务代码无需依赖 Spring 特定 API

2)、Spring 核心基本模块

Spring 框架采用模块化设计,按需引入模块,核心模块分为核心容器、AOP、数据访问、Web、测试五大类:

  1. 核心容器模块(Spring 的心脏)

负责创建、管理、装配 Java 对象(Bean),是所有模块的基础

spring-core:框架核心工具类,其他模块的基础

spring-beans:Bean 工厂,负责对象的创建、配置、管理

spring-context:上下文模块,封装容器功能,提供框架启动、事件监听等能力

spring-expression:Spring EL 表达式语言,支持运行时查询、操作对象

  1. AOP 与 Instrumentation 模块

实现面向切面编程,解耦日志、事务、权限等通用横切逻辑

spring-aop:AOP 核心实现,支持方法拦截、切面配置

spring-aspects:集成 AspectJ 框架,提供更强大的 AOP 能力

spring-instrument:类加载器模块,用于服务器级别的类增强

  1. 数据访问 / 集成模块

简化数据库操作、事务管理,整合持久层框架

spring-jdbc:封装 JDBC,简化数据库连接、SQL 执行

spring-tx:声明式事务管理,无需手动编写事务代码

spring-orm:整合 Hibernate、MyBatis 等 ORM 框架

spring-oxm:对象 XML 映射

spring-jms:消息队列相关操作

  1. Web 模块

用于开发 Web 应用、REST 接口

spring-web:基础 Web 功能,文件上传、过滤器等

spring-webmvc:Spring MVC 框架,实现 MVC 设计模式,开发 Web 接口

spring-websocket:支持 WebSocket 长连接

spring-webflux:响应式 Web 开发模块(高性能、非阻塞)

  1. 测试模块

spring-test:提供单元测试、集成测试支持,可测试 Spring 容器中的 Bean

总结

Spring 是Java 企业级核心框架,核心是 IoC(解耦)和 AOP(通用逻辑抽离);

模块化设计,核心容器是基础,Web、数据访问、AOP 是最常用模块;

日常开发中,Spring Boot 已封装这些模块,开箱即用。

二、开发Spring的基本步骤

第一步:使用Idea创建Maven项目

第二步:修改pom.xml文件导入Spring包

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.newer</groupId>

<artifactId>testspring</artifactId>

<version>1.0-SNAPSHOT</version>

<dependencies>

<!--Spring的基础包Spring-core-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>5.2.8.RELEASE</version>

</dependency>

<!--Spring的基础包Spring-beans-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>5.2.8.RELEASE</version>

</dependency>

<!--Spring的基础包Spring-context-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>5.2.8.RELEASE</version>

</dependency>

<!--Spring的基础包Spring-expressinon-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-expression</artifactId>

<version>5.2.8.RELEASE</version>

</dependency>

<!--Spring的依赖包commons-logging-->

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.2</version>

</dependency>

</dependencies>

<properties>

<maven.compiler.source>8</maven.compiler.source>

<maven.compiler.target>8</maven.compiler.target>

</properties>

</project>

第三步:在src/main/java下新建HelloSpring的类,包路径为com.newer

package com.newer;

public class HelloSpring {

private String userName;

public void setUserName(String userName){

this.userName=userName;

}

public void show(){

System.out.println(userName+":欢迎来到Spring");

}

}

第四步:在main/resources/下创建Spring框架核心配置文件:

applicationContext.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">

<!-- 将指定类配置给Spring,让Spring创建HelloSpring对象的实例 -->

<bean id="helloSpring" class="com.newer.HelloSpring">

<!--为userName属性赋值-->

<property name="userName" value="张三"></property>

</bean>

</beans>

第五步:test/java/下编写测试类TestHelloSpring,包路径为com.newer。其下编写测试方法

import com.newer.HelloSpring;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestHelloSpring {

public static void main(String[] args) {

//初始化spring容器,加载applicationContext.xml配置

ApplicationContext applicationContext=new

ClassPathXmlApplicationContext("applicationContext.xml");

//通过容器获取配置中helloSpring的实例

HelloSpring helloSpring=

(HelloSpring)applicationContext.getBean("helloSpring");

helloSpring.show();//调用方法

}

}

三、控制反转和依赖注入的基本概念

Spring IoC(控制反转)和 DI(依赖注入)

是 Spring 最核心的设计思想,IoC 是设计思想,DI 是实现 IoC 的具体手段,

经常一起出现但含义不同。

一、IoC(Inversion of Control)控制反转

一句话理解

把对象的创建、管理、生命周期交给 Spring 容器,不再由开发者手动 new 对象,控制权从代码反转给了框架。

通俗解释

传统开发:你需要什么对象,自己 new 出来,自己管理依赖。

Spring IoC:你告诉 Spring 需要什么对象,Spring 帮你创建、组装、管理,你直接用就行。

核心作用

解耦:让类与类之间不硬编码依赖,降低代码耦合,方便维护和测试。

2)、DI(Dependency Injection)依赖注入

一句话理解

Spring 在运行时,自动把需要的依赖对象赋值给需要它的对象,不需要手动赋值。

通俗解释

比如 A 类需要用到 B 对象:

传统:A a = new A(); a.setB(new B());

DI:Spring 自动把创建好的 B 对象 "注入" 给 A,你直接用即可。

三种常用注入方式

构造器注入(官方推荐,最安全)

Setter 方法注入

字段注入(@Autowired 直接写在属性上)

3)、两者关系(最关键)

IoC 是思想:把对象控制权交给容器。

DI 是实现方式:通过注入依赖,完成 IoC。

可以记成一句话:

Spring 通过依赖注入(DI),实现了控制反转(IoC) 的设计思想。

总结

IoC 控制反转:对象创建、管理交给 Spring 容器,控制权反转。

DI 依赖注入:Spring 自动把依赖对象赋给目标类。

关系:DI 是手段,IoC 是目的。

四、依赖注入的二种类型

1、构造注入

1)、基本概念

构造注入是 Spring 依赖注入(DI) 的首选方式,指通过类的构造方法,将依赖对象自动传入并赋值,完成依赖注入。

  1. 核心特点

通过构造方法传入依赖,Spring 调用构造方法时自动把需要的 Bean 传进去

Spring 官方唯一推荐的注入方式

依赖在对象创建时就必须传入,保证依赖不能为空、一定存在

适合强制依赖、必须注入的场景

  1. 简单示例

@Service

public class UserService {

private final UserDao userDao;

// 构造注入:Spring 自动传入 UserDao 对象

public UserService(UserDao userDao) {

this.userDao = userDao;

}

}

  1. 优点(为什么推荐)

不可变:可以用 final 修饰依赖,线程安全、更稳定

强制依赖:对象创建时必须传入,避免空指针

易于测试:直接传 mock 对象,不用依赖 Spring

代码更清晰:依赖一目了然

总结

构造注入 = 用构造方法接收依赖,是 Spring 最安全、最推荐的注入方式,保证依赖必传、不可变、更稳定。

2)、使用步骤

第一步:新建User1类,在User1类中定义id、name和password三个属性,定义了User1()的构造方法和toString()方法。

package com.newer;

public class User1 {

private int id;

private String name;

private String password;

//有参构造方法

public User1(int id, String name, String password){

this.id=id;

this.name=name;

this.password=password;

}

public String toString(){

return "id="+id+",name="+name+",password="+password;

}

}

第二步:获取Bean的配置信息:创建applicationContext-User.xml文件,在该文件中添加User1类的配置信息。

<?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">

<bean id="user1" class="com.newer.User1">

<constructor-arg name="id" value="1"></constructor-arg>

<constructor-arg name="name" value="张三"></constructor-arg>

<constructor-arg name="password" value="123"></constructor-arg>

</bean>

</beans>

第三步:编写测试类:创建测试类TestUser1,用于测试依赖注入的结果。

import com.newer.User1;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUser1 {

public static void main(String[] args)throws Exception{

//加载applicationContext.xml配置

ApplicationContext applicationContext=new

ClassPathXmlApplicationContext("applicationContext-User.xml");

//获取配置中的User1实例

User1 user1=applicationContext.getBean("user1", User1.class);

System.out.println(user1);

}

}

2、设值注入(SET注入)

第一步:编写用户类:新建User2类,在User2类中定义id、name和password三个属性。

package com.newer;

public class User2 {

private int id;

private String name;

private String password;

public void setId(int id){

this.id=id;

}

public void setName(String name){

this.name=name;

}

public void setPassword(String password){

this.password=password;

}

public String toString(){

return "id="+id+",name="+name+",password="+password;

}

}

第二步:获取Bean的配置信息:创建applicationContext-User2.xml文件,并在该文件的bean元素中添加User2类的配置信息。

<?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">

<bean id="user2" class="com.newer.User2">

<property name="id" value="2"></property>

<property name="name" value="李四"></property>

<property name="password" value="456"></property>

</bean>

</beans>

第三步:编写测试类:创建测试类TestUser2,用于测试依赖注入的结果。

import com.newer.User2;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUser2 {

public static void main(String[] args)throws Exception {

//加载applicationContext.xml配置

ApplicationContext applicationContext = new

ClassPathXmlApplicationContext("applicationContext-User2.xml");

//获取配置中的User2实例

User2 user2 = applicationContext.getBean("user2", User2.class);

System.out.println(user2);

}

}

五、基于依赖注入实现三层结构的组装和解耦合。

1)、什么是三层结构

1、分层思想(核心原则)

把一个复杂系统按 "职责" 拆成多层,每层只做自己的事,层与层之间单向依赖、下层为上层服务。

目的:解耦、复用、易维护、易扩展、易分工。

2、经典三层架构(Java Web 最常用)

从上到下分为:表现层 → 业务逻辑层 → 数据访问层

  1. 表现层(Controller / Web 层)

负责接收请求、返回响应

做参数校验、封装结果、页面 / 接口交互

不写业务逻辑,只调用 Service

  1. 业务逻辑层(Service 层)

核心业务处理、规则判断、事务控制

组合多个 DAO 操作,保证数据一致性

向上给 Controller 提供服务,向下调用 DAO

  1. 数据访问层(Dao / Mapper 层)

只和数据库交互:增删改查

封装 JDBC/MyBatis 操作

不处理业务,只做数据读写

3、调用关系

Controller → Service → Dao → DB

上层依赖下层,下层不依赖上层,职责清晰、互不干扰。

一句话总结

三层结构就是:Controller 收请求,Service 做业务,Dao 读写库,通过分层让代码好写、好改、好维护。

2)、基于接口注入实现三层结构的组装和解耦合

第一步:编写DAO层:创建接口IUserDao.java,在IUserDao.java接口中添加方法login(),用于实现登录功能。

package com.newer.dao;

public interface IUserDao {

public boolean login(String name,String password);

}

第二步:编写DAO层的实现类:创建UserDao接口的实现类UserDaoImpl,在UserDaoImpl类中实现login()方法。

package com.newer.dao.impl;

import com.newer.dao.IUserDao;

public class UserDaoImpl implements IUserDao {

@Override

public boolean login(String name, String password) {

if (name.equals("张三")&&password.equals("123")){

return true;

}

return false;

}

}

第三步:编写Service层:新建service包,在service包下创建接口IUserService.java,在接口中添加方法login()。

package com.newer.service;

public interface IUserService {

public boolean login(String name,String password);

}

第四步、编写Service层实现类:创建UserService接口的实现类UserServiceImpl,在UserServiceImpl类中实现login()方法。

package com.newer.service.impl;

import com.newer.dao.IUserDao;

import com.newer.service.IUserService;

public class UserServiceImpl implements IUserService {

IUserDao userDao;

public void setUserDao(IUserDao userDao) {

this.userDao = userDao;

}

@Override

public boolean login(String name, String password) {

return userDao.login(name,password);

}

}

第五步:修改applicationContext.xml配置文件:使用<bean>元素添加创建的UserDaoImpl类和UserServiceImpl类的实例,并配置其相关属性。

<?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">

<!-- 将指定类配置给Spring,让Spring创建HelloSpring对象的实例 -->

<bean id="helloSpring" class="com.newer.HelloSpring">

<!--为userName属性赋值-->

<property name="userName" value="张三"></property>

</bean>

<bean id="userDao" class="com.newer.dao.impl.UserDaoImpl"></bean>

<bean id="userService" class="com.newer.service.impl.UserServiceImpl">

<property name="userDao" ref="userDao"></property>

</bean>

</beans>

第六步:编写测试类:在com.itheima包中新建测试类TestSpring,测试依赖注入。

import com.newer.service.IUserService;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring {

public static void main(String[] args){

//加载applicationContext.xml配置

ApplicationContext applicationContext=new

ClassPathXmlApplicationContext("applicationContext.xml");

//获取配置中的UserService实例

IUserService userService=(IUserService)

applicationContext.getBean("userService");

boolean flag =userService.login("张三","123");

if (flag){

System.out.println("登录成功");

}else {

System.out.println("登录失败");

}

}

}

相关推荐
成都渲染101云渲染66663 小时前
跳出“硬件堆砌”陷阱|渲染101如何用技术重构云渲染的专业价值?
java·前端·javascript
白毛大侠3 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
golang学习记3 小时前
IDEA 2026.1全新调试新特性:Spring Boot调试不再靠猜!
java·spring boot·intellij-idea
ForteScarlet3 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
橘子编程3 小时前
OpenClaw(小龙虾)完整知识汇总
java·前端·spring boot·spring·spring cloud·html5
大阿明3 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff3 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法
TlYf NTLE3 小时前
Spring Boot3.3.X整合Mybatis-Plus
spring boot·后端·mybatis
rOuN STAT3 小时前
MySQL:基础操作(增删查改)
java