Spring深度剖析:基础认知与入门应用全解析

Spring深度剖析:基础认知与入门应用全解析

文章目录

  • Spring
    • spring概述
    • 1 Spring定义
    • 2 Spring核心
    • 3 Spring Framework的特点
    • 入门案例
    • 1 环境要求
    • 2 构建工程
      • 2.1 构建子工程first - spring
      • 2.2 入门案例
      • 2.3 对象存储
    • IoC容器
    • 1 控制反转IoC
    • 2 依赖注入DI
    • 3 IoC容器实现
    • 4 基于XML管理bean
      • 4.1 环境准备
      • 4.2 获取bean方式
      • 4.3 基于setter依赖注入
      • 4.4 基于构造器依赖注入
      • 4.5 特殊值处理注入
      • 4.5.1 字面量赋值
      • 4.5.2 null值
      • 4.5.3 xml实体
      • 4.5.4 CDATA区
      • 4.6 对象类型属性注入
      • 4.6.1 引用外部bean
      • 4.6.2 内部bean
      • 4.6.3 级联属性赋值(了解)
      • 4.7 数组类型属性注入
      • 4.8 集合类型属性注入
      • 4.8.1 List集合属性注入
      • 4.8.2 Map集合属性注入
      • 4.8.3 引用集合类型bean注入
      • 4.9 p命名空间
      • 4.10 引入外部属性文件
      • 4.11 bean的作用域
      • 4.12 bean的生命周期
      • 4.12.1 bean的完整生命周期
      • 4.12.2 生命周期验证
      • 4.12.3 bean生命周期扩展
      • 4.13 基于xml自动装配
    • 5 基于注解管理bean
      • 5.1 创建子工程
      • 5.2 开启组件扫描
      • 5.3 使用注解定义Bean
      • 5.4 @Autowired注入
      • 5.4.1 属性注入
      • 5.4.2 set注入
      • 5.4.3 构造方法注入
      • 5.4.4 形参上注入
      • 5.4.5 只有一个构造函数,无注解
      • 5.4.6 @Autowire注解和@Qualifier注解联合
      • 5.5 @Resource注入
      • 5.6 Spring全注解开发

Spring

在这里插入图片描述

spring概述

1 Spring定义

Spring是一款主流的轻量级Java EE开源框架,其作用在于简化Java企业级应用的开发难度与周期。从简单性、可测试性以及松耦合的角度来看,任何Java应用都能从Spring中受益。Spring框架不仅能提供自身功能,还具备整合其他技术与框架的能力。

自诞生以来,Spring一直深受开发者的喜爱,长期作为Java企业级应用程序开发的首选。时至今日,Spring已然成为Java EE的代名词,成为构建Java EE应用的实际标准。

自2004年4月Spring 1.0版本正式发布后,Spring已发展到第6个大版本,即Spring 6,本文采用Spring 5.3.24正式版本。

在这里插入图片描述

2 Spring核心

Spring所指的是Spring Framework,通常被称为Spring框架。它是一个分层的面向切面的Java应用一站式解决框架,是Spring技术栈的核心与基础,用于解决企业级应用开发的复杂性问题。

Spring有两个核心模块:IoC和AOP。

IoC(Inverse of Control)即控制反转,是将创建对象的工作交由Spring进行管理。

AOP(Aspect Oriented Programming)即面向切面编程。AOP用于封装多个类的公共行为,把那些与业务无关但被业务模块共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。此外,AOP还能解决一些系统层面的问题,比如日志、事务、权限等。

3 Spring Framework的特点

  • 控制反转(IoC):反转资源获取的方向;将自身创建资源、向环境索取资源转变为环境准备好资源,由我们享受资源注入。
  • 面向切面编程(AOP):在不修改源代码的基础上增强代码功能。
  • 容器:Spring IoC是一个容器,因为它包含并管理组件对象的生命周期;组件受到容器化管理,为程序员屏蔽了组件创建过程中的诸多细节,极大降低了使用门槛,大幅提高了开发效率。
  • 一站式:在IOC和AOP的基础上能够整合各种企业应用的开源框架和优秀的第三方库,而且Spring旗下的项目覆盖了广泛领域,很多方面的功能性需求都可以在Spring Framework的基础上用Spring来实现。

入门案例

1 环境要求

  • JDK:Java 8 - 15
  • Spring:5.3.24

2 构建工程

2.1 构建子工程first - spring

在jsd2303 - spring中创建子工程spring - first

  1. 选择New - Module
  2. 点击Next
  3. 将Name设置为spring - first,然后点击Finish
2.2 入门案例

① 在spring - first/pom.xml中引入相关依赖,并刷新maven

<dependencies>
    <!-- 引入spring context依赖,引入后会将Spring的基础依赖引入 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring - context</artifactId>
        <version>5.3.24</version>
    </dependency>
</dependencies>

② 在工程中创建包cn.tedu.spring.begin

③ 创建类User

④ 在User类中定义方法

public class User {
    public void add() {
        System.out.println("添加方法...");
    }
}

⑤ 创建spring配置文件:在resources目录下创建bean.xml

⑥ 在bean.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">
    <!-- 创建user对象,id为唯一标识,class为要创建对象所在类的绝对路径 -->
    <bean id="user" class="cn.tedu.spring.User"></bean>
</beans>

⑦ 创建测试类cn.tedu.spring.TestUser进行测试

public class TestUser {
    public static void main(String[] args) {
        // 1.加载spring配置文件,进行对象创建
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        // 2.获取spring创建好的对象
        User user = (User) context.getBean("user");
        // 3.使用对象调用方法测试
        System.out.println("user = " + user);
        user.add();
    }
}
2.3 对象存储

将对象存放到容器中,查看源码,在DefaultListableBeanFactory.java的第164行,可以看到key是唯一标识,value是类的定义(包含描述信息)。可以查看BeanDefinition的源码,其中有类的描述信息、是否初始化的状态等内容。

IoC容器

IoC是Inversion of Control的缩写,译为控制反转。

Spring通过IoC容器来管理所有Java对象的实例化和初始化,把控对象与对象之间的依赖关系。由IoC容器管理的Java对象被称为Spring Bean,它与使用关键字new创建的Java对象没有本质区别。

IoC容器是Spring框架中极为重要的核心组件之一,贯穿了Spring从诞生到发展的整个过程。

1 控制反转IoC

  • 控制反转是一种思想
    • 将对象的创建权交出去,交由第三方容器负责
    • 将对象与对象之间的关系维护权交出去,交由第三方容器负责
  • 实现方式
    通过依赖注入DI的方式来实现

2 依赖注入DI

DI(Dependency Injection)即依赖注入,依赖注入实现了控制反转的思想,是指Spring在创建对象的过程中,把对象依赖的属性通过配置进行注入。

依赖注入常见的实现方式有两种:
- set注入
- 构造注入

所以,IoC是一种控制反转的思想,而DI是对IoC的具体实现。

Bean管理指的是Bean对象的创建,以及Bean对象中属性的赋值(或Bean对象之间关系的维护)

3 IoC容器实现

Spring中的IoC容器是IoC思想的一个落地产品。IoC容器中管理的组件也叫bean。在创建bean之前,首先要创建IoC容器,Spring提供了两种IoC容器的实现方式:

① BeanFactory
这是IoC容器的基本实现,是Spring内部使用的接口,面向Spring自身,不提供给开发人员使用。

② ApplicationContext
ApplicationContext是BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用ApplicationContext,而非底层的BeanFactory

源码说明:

4 基于XML管理bean

4.1 环境准备

① 创建子工程spring - ioc - xml

② 在pom.xml中引入spring依赖,并刷新maven

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring - context</artifactId>
        <version>5.3.24</version>
    </dependency>
</dependencies>

③ 在resources目录下创建spring配置文件bean.xml

④ 在工程的java目录下创建类cn.tedu.spring.iocxml.User

public class User {
    private String username;
    private String password;

    public void userMethod() {
        System.out.println("userMethod执行~~");
    }
}
4.2 获取bean方式
  • 根据id获取
    id属性是bean的唯一标识,所以依据bean标签的id属性能够精确获取到一个组件对象。

① bean.xml

<bean id="user" class="cn.tedu.spring.iocxml.User"></bean>

② 创建测试类UserTest

public class UserTest {
    public static void main(String[] args) {
        // 1.加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        // 2.根据id获取bean
        User user1 = (User) context.getBean("user");
        System.out.println("1-根据id获取对象:" + user1);
        user1.userMethod();

        User user2 = context.getBean(User.class);
        System.out.println("2-根据类型获取bean:" + user2);
        user2.userMethod();

        User user3 = context.getBean("user", User.class);
        System.out.println("3-根据id和类型获取bean:" + user3);
        user3.userMethod();
    }
}
  • 注意
    当依据类型获取bean时,要求IoC容器中指定类型的bean只能有一个,若配置两个会抛出异常
<bean id="user" class="cn.tedu.spring.iocxml.User"></bean>
<bean id="user2" class="cn.tedu.spring.iocxml.User"></bean>
4.3 基于setter依赖注入

类具有属性,在创建对象的过程中,向属性注入具体的值。

方式1:使用set方法完成(通过xml中的标签实现)

方式2:基于构造器完成

案例

① 创建Package名为dibase,创建Book类

package cn.tedu.spring.DI;

public class Book {
    private String bookName;
    private String bookAuthor;

    public Book() {}

    public Book(String bookName, String bookAuthor) {
        this.bookName = bookName;
        this.bookAuthor = bookAuthor;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookAuthor() {
        return bookAuthor;
    }

    public void setBookAuthor(String bookAuthor) {
        this.bookAuthor = bookAuthor;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookAuthor='" + bookAuthor + '\'' +
                '}';
    }
}

② 创建spring配置文件:在resources目录下创建bean - di.xml

<!-- set方法注入 -->
<bean id="book" class="cn.tedu.spring.DI.Book">
    <!-- 使用property标签注入 -->
    <property name="bookName" value="java"></property>
    <property name="bookAuthor" value="tedu"></property>
</bean>

③ 创建测试类TestBook进行测试

public class BookTest {
    @Test
    public void springSetTest() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean-di.xml");
        Book book = context.getBean("book", Book.class);
        System.out.println("book = " + book);
    }
}
4.4 基于构造器依赖注入
  • 说明
    通过构造器的方式实现依赖注入

  • 操作步骤说明

    1. 创建类,定义属性,生成有参数构造方法
    2. 进行xml配置
    3. 创建测试类测试

① 创建电影信息类Film,定义属性并生成全参构造方法

public class Film {
    private String title;
    private String actor;

    public Film(String title, String actor) {
        System.out.println("Film的有参构造已经执行~~");
        this.title = title;
        this.actor = actor;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    @Override
    public String toString() {
        return "Film{" +
                "title='" + title + '\'' +
                ", actor='" + actor + '\'' +
                '}';
    }
}

② 在bean - di.xml中进行注入配置

<!-- 构造器注入演示:Film类 -->
<bean id="film" class="cn.tedu.spring.DI.Film">
    <constructor-arg name="title" value="霸王别姬"></constructor-arg>
    <constructor-arg name="actor" value="张国荣"></constructor-arg>
</bean>

③ 创建测试类TestFilm测试

public class FilmTest {
    @Test
    public void FilmConsDITest() {
        // 1.加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean-di.xml");
        // 2.获取指定bean
        Film film = context.getBean("film", Film.class);
        // 3.输出测试
        System.out.println("film = " + film);
    }
}
4.5 特殊值处理注入
4.5.1 字面量赋值

当使用value属性给bean的属性赋值时,spring会把value的属性值当作字面量

<property name="number" value="1016"></property>
4.5.2 null值

使用标签或者标签实现注入。

① Film类中增加电影描述属性

private String description;

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

② bean - di.xml配置文件调整

<!-- 构造器注入演示:Film类 -->
<bean id="film" class="cn.tedu.spring.DI.Film">
    <constructor-arg name="title" value="霸王别姬"></constructor-arg>
    <constructor-arg name="actor" value="张国荣"></constructor-arg>
    <!-- 电影描述注入空值null -->
    <constructor-arg name="description">
        <null></null>
    </constructor-arg>
</bean>

③ 执行测试类进行测试

课堂练习:

在cn.tedu.spring下创建包exercise,在包下创建商品表Product,类属性如下:

商品标题:title

商品库存:num

商品销量:sales

商品描述:comment

  1. 实现商品Product类的创建,包含setter()、getter()、toString()方法

```java
public class Product {
private String title;
private Integer num;
private Integer sales;
private String comment;

public Product() {}

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13550.html

(0)
LomuLomu
上一篇 2025 年 9 月 14 日
下一篇 2025 年 9 月 16 日

相关推荐

  • 2025年最新PyCharm激活码及永久破解教程(支持2099年)

    前言 本教程适用于JetBrains全家桶,包括PyCharm、IDEA、DataGrip、Golang等开发工具!先看最新PyCharm版本成功破解到2099年的效果图,让你放心使用!效果图展示 接下来将详细讲解如何永久激活PyCharm至2099年。这个方法同样适用于旧版本,无论你使用:- Windows/Mac/Linux系统- 任何PyCharm版本…

    PyCharm激活码 2025 年 7 月 8 日
    39600
  • IDEA破解需要联网吗?离线激活方法详解!

    重要提示:以下激活补丁与序列号均搜集自互联网,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版! IntelliJ IDEA 是 JetBrains 出品的跨平台 IDE,支持 Windows、macOS 与 Linux。本文将手把手演示如何利用破解补丁实现永久激活,解锁全部高级特性。 无论你安装的是哪个版本、使用哪种操作系统,下面都已为你整理好步骤。…

    IDEA破解教程 2025 年 9 月 19 日
    5900
  • DataGrip破解后JetBrains Toolbox还能用吗?

    免责声明:下文所涉 DataGrip 破解补丁及激活码均源自互联网公开分享,仅供个人学习研究,禁止商业用途。如条件允许,请支持正版!官方正版低至 32 元/年,全家桶通用:https://panghu.hicxy.com/shop/?id=18 DataGrip 是 JetBrains 出品的多平台数据库 IDE,Windows、macOS、Linux 均可…

    DataGrip激活码 2025 年 9 月 13 日
    8500
  • Java垃圾回收机制深度解析与优化实践

    目录导航一、Java内存自动管理机制的核心原理(一)GC基础概念全面解析1.垃圾回收的三种维度理解2.应用线程的内存分配行为3.线程专属内存分配区4.跨代引用追踪技术(二)开发者掌握GC知识的必要性1.系统响应性能影响2.内存资源高效管理3.计算资源合理分配4.系统瓶颈消除策略5.运行时状态监控6.高并发场景支持二、GC工作机制详解(一)内存区域划分1.堆栈…

    未分类 2025 年 5 月 13 日
    16500
  • 2025年最新PyCharm激活码与永久破解教程(支持2099年)

    本方法适用于JetBrains全家桶,包括PyCharm、IDEA、DataGrip、Goland等所有产品! 先给大家看看最新PyCharm版本成功破解的截图,可以看到已经完美激活到2099年,非常稳定! 下面我将通过详细的图文教程,手把手教你如何将PyCharm永久激活至2099年。 这个方法不仅适用于最新版本,之前的旧版本也同样有效! 兼容所有操作系统…

    PyCharm激活码 2025 年 8 月 18 日
    31500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信