Spring 框架学习笔记

什么是框架?

框架是一种应用程序内部预设了常见问题解决方案的工具。开发者可以直接调用框架的方法以简化开发。

Spring 核心功能

Spring 作为组件管理框架,具有以下核心功能:

  1. IoC(控制反转)

    • Spring 充当组件管理者,将组件的创建、管理和存储职责交由容器负责。
    • Spring IoC 容器是复杂容器,与普通容器(如数组、集合)和 Servlet 容器类似,但更具灵活性。
  2. DI(依赖注入)

    • 通过依赖注入,容器动态提供对象所需的依赖,而非硬编码依赖。
    • 只有交由 Spring 管理的组件才能享受其家族的其他功能(如 AOP、事务管理)。

Spring 核心模块

1. 核心容器(Core Container)

2. 数据访问与集成

3. Web 模块

4. Spring Boot

5. Spring Cloud

6. 安全模块

7. 测试模块

容器配置

为了适应现代开发环境,推荐使用 配置类 + 注解 的方式。

Spring 的优点

  1. 降低耦合度:通过 DI 动态注入依赖,减少组件间硬编码耦合。
  2. 提高可测试性:方便使用 Mock 对象进行单元测试。
  3. 增强灵活性:通过配置文件或注解动态调整依赖关系。
  4. 模块化设计:可按需选择模块使用。
  5. 统一管理:集中管理组件及依赖关系,提高一致性。
  6. 丰富生态系统:大量扩展与社区支持。
  7. 简化配置:Spring Boot 提供默认配置,专注业务逻辑。

组件管理

Spring 的 IoC 容器允许开发者通过配置文件或注解定义组件,并自动管理它们的生命周期和依赖关系。


第一步 编写配置信息

第二步 实例化IoC对象

第三步 通过IoC容器获取组件

IoC配置

一 XML文件的方式

在resources中创建配置文件
建议使用此方式一键创建
New - XML Configuration - Spring Config

DI 的配置

有两种注入方式
1.基于构造函数的依赖注入
2.基于Setter的依赖注入

引用和被引用的容器必须在IoC容器中

有参构造函数 可以在bean标签中传参

多个构造参数注入三种方式

顺序 name index
推荐使用 name

另外 声明顺序无所谓

SpringIoC是一个高级容器
内部会有缓存操作,线创建对象,再进行赋值

基于 Setter 注入(重要)

name->属性名 setter方法的 去set和首字母小写的值!调用set方法的
setMovieFinder ->movieFinder
value |ref 二选一
value="直接属性值”ref =”其他bean的Id"

IoC 容器的创建和使用

如何创建 ioc 并读取配置文件

在 ioc 容器中获取组件 bean

单例 一个 bean 标签(scope = 单例)对应一个 beandefinition 对应一个 组件对象
多例 对应多个组件对象

例子 单例

单例输出 true

多例

此时输出 false

拓展 spring-ioc factorybean

factorybean 介绍

应用场景

创建一个 factorybean
1 实现 factorybean 接口 <返回值泛型>

配置到 ioc 容器内

输出

使用注解方式管路组件 (bean)

注解

  1. @component:这是一个通用的注解,用于标记一个类为Spring的组件。它可以用于任何层次的组件。
@Component
public class MyComponent {
    // 组件逻辑
}
  1. @controller:用于标记控制器组件,通常用于Web层。
@Controller
public class MyController {
    // 控制器逻辑
}
  1. @service:用于标记服务层组件,通常用于业务逻辑层。
@Service
public class MyService {
    // 服务逻辑
}
  1. @repository:用于标记持久层组件,通常用于数据访问层。
@Repository
public class MyRepository {
    // 数据访问逻辑
}
  1. @Autowired:用于自动装配Bean,可以标记在字段、构造器或方法上。
@Autowired
private MyService myService;
  1. @configuration@bean:用于Java配置类中,定义和配置Bean。
@Configuration
public class AppConfig {
    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }
}

注意:添加ioc注解,默认组件名默认为类的首字母小写

示例

周期方法命名随意,但必须是 public void 没有形参

自动注解装配

  1. @Autowired:这是最常用的自动装配注解。它可以用于构造器、方法或字段上,Spring会自动根据类型匹配Bean。
@Autowired
private MyService myService;
  1. @qualifier:当有多个相同类型的Bean时,可以使用@qualifier指定需要注入的Bean的名称。
@Autowired
@Qualifier("specificBeanName")
private MyService myService;
  1. @primary:当有多个相同类型的Bean时,可以使用@primary标记一个Bean为首选Bean。
@Primary
@Bean
public MyService myPrimaryService() {
    return new MyServiceImpl();
}
  1. @resource:这是Java标准的注解,类似于@Autowired,但可以通过名称或类型进行注入。
@Resource(name = "myService")
private MyService myService;
  1. @Inject:这是来自JSR-330的注解,功能类似于@Autowired
@Inject
private MyService myService;

佛系装配 是一种在 Spring 框架中使用的自动装配技术,旨在简化配置和提高开发效率。以下是其主要特点:

这种方法能够显著减少配置文件的复杂度,使开发过程更加高效和简洁。

不太建议使用佛系装配

JSR注解

Resource注解

赋值方法

引入使用@value

总结

使用注解配置依然会使用到xml文件,没有摆脱xml解析效率低的问题·

1.注解的扫描配置

2.引入外部的文件

3.引入第三方的bean也仍然需要xml文件


使用@Autowirted需要先使用@repository

配置类(完全注解开发)

配置类可以完全替代xml,解决解析效率问题

description : java的配置类、替代xml文件

  1. 包扫描注解配置
  2. 引用外部配置文件
  3. 声明第三方以来的bean组件

步骤:

  1. 添加@configuration 代表是配置类
  2. 实现上面的三个功能注解

示例:

注意:在刷新的时候才进行ioc和di的注入

@bean 定义组件

取名字@bean(name="",initMethod)

引用其它ioc容器

两种方式,推荐二
直接调用bean方法即可
直接形参变量引入,要求必须有对应的组件,如果有多个,形参名 = 组件id标识即可

@import 注解使用

配置类

搭建测试环境

4.6 整合Spring5-Test5搭建测试环境

  1. 整合测试环境作用 好处1:不需要自己创建IOC容器对象了 好处2:任何需要的bean都可以在测试类中直接享受自动装配
  2. 导入相关依赖
<!--junit5测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>6.0.6</version>
    <scope>test</scope>
</dependency>
  1. 整合测试注解使用
//@SpringJUnitConfig(locations = {"classpath:spring-context.xml"})  //指定配置文件xml
@SpringJUnitConfig(value = {BeanConfig.class})  //指定配置类
public class Junit5IntegrationTest {
    
    @Autowired
    private User user;
    
    @Test
    public void testJunit5() {
        System.out.println(user);
    }
}

废稿

写了干脆放出来

配置maven

配置出问题时需要做两件事

最后清除缓存

创建项目

选择必要的选项(目前默认即可)

(可以删除没有的东西)

Spring启动的默认组件

安装组件 一键生成默认值

给容器添加自己的组件

从容器中获取组件

@bean

将组件放到容器中

小结:

从容器中获取组件,

1)、组件不存在,抛异常:NoSuchBeanDefinitionException

2)组件不唯一,抛异常:NoUniqueBeanDefinitionException

3)、组件唯一存在,正确返回。

组件是单实例的

组件创建:容器启动时就会创建

单实例特性:所有组件默认是单例的,使用时从容器中调用