Spring 框架学习笔记
什么是框架?
框架是一种应用程序内部预设了常见问题解决方案的工具。开发者可以直接调用框架的方法以简化开发。
- 有 jar 包,可以自定义配置的工具即为框架。
Spring 核心功能
Spring 作为组件管理框架,具有以下核心功能:
-
IoC(控制反转)
-
DI(依赖注入)
Spring 核心模块
1. 核心容器(Core Container)
- 包含核心模块、上下文模块、Bean 工厂和 SpEL(Spring 表达式语言)。
- 核心模块:提供 DI 功能。
- 上下文模块:框架式对象访问方式。
- Bean 工厂:用于创建和管理 Bean 对象。
- SpEL:支持在 XML 和注解中使用表达式。
2. 数据访问与集成
- JDBC 模块:简化数据库访问,提供统一异常处理和事务管理。
- ORM 模块:支持 Hibernate、JPA、MyBatis 等。
- 事务管理:支持声明式和编程式事务管理。
3. Web 模块
- Spring MVC:基于 MVC 模式,简化 Web 应用开发。
- 控制器:处理用户请求。
- 视图解析器:渲染视图(如 JSP、Thymeleaf)。
- 数据绑定和验证:自动绑定请求参数并进行验证。
4. Spring Boot
- 自动配置:根据依赖自动配置应用。
- 嵌入式服务器:支持嵌入式 Tomcat、Jetty 等。
- Spring Initializr:快速创建 Spring Boot 项目。
5. Spring Cloud
- 服务发现:使用 Eureka 或 Consul。
- 配置管理:使用 Spring Cloud Config。
- 断路器:使用 Hystrix 增强容错能力。
6. 安全模块
- Spring Security:支持认证和授权。
- 认证:表单登录、OAuth2 等。
- 授权:基于角色和权限控制。
7. 测试模块
- 提供对 Spring 应用的单元测试和集成测试支持。
- Mock 对象:与 Mockito 集成。
- 测试上下文:加载 Spring 上下文进行测试。
容器配置
Spring 的优点
- 降低耦合度:通过 DI 动态注入依赖,减少组件间硬编码耦合。
- 提高可测试性:方便使用 Mock 对象进行单元测试。
- 增强灵活性:通过配置文件或注解动态调整依赖关系。
- 模块化设计:可按需选择模块使用。
- 统一管理:集中管理组件及依赖关系,提高一致性。
- 丰富生态系统:大量扩展与社区支持。
- 简化配置:Spring Boot 提供默认配置,专注业务逻辑。
组件管理
- 组件 是可以复用的 Java 对象。
- 组件一定是对象,但对象不一定是组件。
Spring 的 IoC 容器允许开发者通过配置文件或注解定义组件,并自动管理它们的生命周期和依赖关系。
第一步 编写配置信息
第二步 实例化IoC对象
第三步 通过IoC容器获取组件
IoC配置
一 XML文件的方式
- 一个bean就是一个组件
- 使用父工程管理依赖
在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 )周期方法
- 拓展作用域配置
单例 一个 bean 标签(scope = 单例)对应一个 beandefinition 对应一个 组件对象
多例 对应多个组件对象
例子 单例
单例输出 true
多例
此时输出 false
拓展 spring-ioc factorybean
factorybean 介绍
应用场景
创建一个 factorybean
1 实现 factorybean 接口 <返回值泛型>
配置到 ioc 容器内
输出
- beanfactory 和 factorybean 区别
使用注解方式管路组件 (bean)
注解
- @component:这是一个通用的注解,用于标记一个类为Spring的组件。它可以用于任何层次的组件。
@Component
public class MyComponent {
// 组件逻辑
}
- @controller:用于标记控制器组件,通常用于Web层。
@Controller
public class MyController {
// 控制器逻辑
}
- @service:用于标记服务层组件,通常用于业务逻辑层。
@Service
public class MyService {
// 服务逻辑
}
- @repository:用于标记持久层组件,通常用于数据访问层。
@Repository
public class MyRepository {
// 数据访问逻辑
}
- @Autowired:用于自动装配Bean,可以标记在字段、构造器或方法上。
@Autowired
private MyService myService;
- @configuration 和 @bean:用于Java配置类中,定义和配置Bean。
@Configuration
public class AppConfig {
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
}
注意:添加ioc注解,默认组件名默认为类的首字母小写
- 示例 扫描包
- 排除包下的某些注解
- 指定包,指定注解
- 添加注释
- 指定包
示例
- 配置周期方法
周期方法命名随意,但必须是 public void 没有形参
- 扫描包
- 测试
- 输出
自动注解装配
- @Autowired:这是最常用的自动装配注解。它可以用于构造器、方法或字段上,Spring会自动根据类型匹配Bean。
@Autowired
private MyService myService;
- @qualifier:当有多个相同类型的Bean时,可以使用@qualifier指定需要注入的Bean的名称。
@Autowired
@Qualifier("specificBeanName")
private MyService myService;
@Primary
@Bean
public MyService myPrimaryService() {
return new MyServiceImpl();
}
- @resource:这是Java标准的注解,类似于@Autowired,但可以通过名称或类型进行注入。
@Resource(name = "myService")
private MyService myService;
- @Inject:这是来自JSR-330的注解,功能类似于@Autowired。
@Inject
private MyService myService;
佛系装配 是一种在 Spring 框架中使用的自动装配技术,旨在简化配置和提高开发效率。以下是其主要特点:
- 自动装配:通过注解(如 @Autowired),Spring 可以自动满足 bean 之间的依赖,减少显式配置。
- 类型匹配:默认按类型(byType)从容器中匹配一个 bean 注入,支持成员变量、构造器和方法上的注解。
- 避免异常:可以通过设置 @Autowired 的 required 属性为 false 来避免没有匹配类型的 bean 时抛出异常。
- 解决歧义:使用 @primary 或 @qualifier 注解来解决多个 bean 匹配时的歧义问题。
这种方法能够显著减少配置文件的复杂度,使开发过程更加高效和简洁。
不太建议使用佛系装配
JSR注解
Resource注解
赋值方法
- 直接赋值
- 注解赋值(一般用于读写配置信息)
引入使用@value
总结
使用注解配置依然会使用到xml文件,没有摆脱xml解析效率低的问题·
1.注解的扫描配置
2.引入外部的文件
3.引入第三方的bean也仍然需要xml文件
使用@Autowirted需要先使用@repository
配置类(完全注解开发)
配置类可以完全替代xml,解决解析效率问题
description : java的配置类、替代xml文件
- 包扫描注解配置
- 引用外部配置文件
- 声明第三方以来的bean组件
步骤:
- 添加@configuration 代表是配置类
- 实现上面的三个功能注解
示例:
注意:在刷新的时候才进行ioc和di的注入
@bean 定义组件
取名字@bean(name="",initMethod)
引用其它ioc容器
两种方式,推荐二
直接调用bean方法即可
直接形参变量引入,要求必须有对应的组件,如果有多个,形参名 = 组件id标识即可
@import 注解使用
配置类
搭建测试环境
4.6 整合Spring5-Test5搭建测试环境
- 整合测试环境作用 好处1:不需要自己创建IOC容器对象了 好处2:任何需要的bean都可以在测试类中直接享受自动装配
- 导入相关依赖
<!--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>
- 整合测试注解使用
//@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启动的默认组件
安装组件 一键生成默认值
给容器添加自己的组件
从容器中获取组件
将组件放到容器中
小结:
从容器中获取组件,
1)、组件不存在,抛异常:NoSuchBeanDefinitionException
2)组件不唯一,抛异常:NoUniqueBeanDefinitionException
3)、组件唯一存在,正确返回。
组件是单实例的
组件创建:容器启动时就会创建
单实例特性:所有组件默认是单例的,使用时从容器中调用