Spring01 - IOC

Spring Core:IOC控制反转与依赖注入详解
本文详细解读Spring框架中的IoC(控制反转)概念,包括依赖注入的不同方式,其优势、应用流程以及核心接口。同时介绍了Bean的作用域和生命周期,以及如何通过ApplicationContext进行高级功能操作,如装配Bean和国际化支持。
IOC( Inversion of Control):控制反转
  • Spring Core 最核心的部分
  • 依赖注入( Dependency Inversion )
依赖注入的方式
  • Set注入:Setter
  • 接口注入:Interface
  • 构造函数:Constructor
  • 注解:Annotation
    在这里插入图片描述
优势
  • 避免在各处使用new来创建类,并且可以做到统一维护
  • 创建实例的时候不需要了解其中的细节
    在这里插入图片描述
应用
流程
  • 读取Bean配置信息
  • 根据Bean注册表实例化Bean
  • 将Bean实例放到Spring容器中
    在这里插入图片描述
支持的功能
  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化
核心接口
  • BeanFactory:顶级容器接口
  • ApplicationContext
BeanDefinitionRegistry

   提供向IOC容器注册BeanDefinition对象的方法

BeanFactory:Spring框架最核心的接口
  • 提供IOC的配置
  • 包含Bean的各种定义,便于实例化Bean
  • 建立Bean之间的依赖关系
  • Bean生命周期的控制
BeanFactory体系结构

在这里插入图片描述

  • BeanFactory:顶级容器接口
  • ListableBeanFactory:定义了访问容器中Bean基本信息的若干方法。如:查看Bean的个数,获取某一类型Bean的配置名,查看容器中是否包含某一Bean
  • HierarchicalBeanFactory:父子集联IOC容器接口,子容器可以通过方法访问父容器,父容器不能访问子容器Bean,例:MVC中展现层的Bean位于一个子容器中,而业务层、持久层的Bean位于父容器,展现层可以引用业务层、持久层的Bean,业务层看不到展现层的Bean
  • ConfigurableBeanFactory:增强了IOC容器的可定制性,定义了设置类型装载器,属性编辑器,属性初始化后置处理器
  • AutoWireCapableBeanFactory:定义了容器中的Bean按某种规则,如按名称,类型等自动装配
  • SingletonBeanRegistry:允许在运行期间向容器注册Singleton实例Bean的方法
BeanFactory与ApplicationContext的比较
  • BeanFactory是Spring框架的基础设施,面向Spring
  • ApplicationContext面向使用Spring框架的开发者
ApplicationContext的功能( 继承多个接口 )
  • BeanFactory:能够管理、装配Bean
  • ResourcePatternResolver:能够加载资源文件
  • MessageSource:能够实现国际化等功能
  • ApplicationEventPublisher:能够注册监听器,实现监听机制

IOC的getBean方法
  • 转换BeanName
  • 从缓存中加载实例
  • 实例化Bean
  • 检测parentBeanFactory
  • 初始化依赖的Bean
  • 创建Bean
Spring Bean的作用域
  • singleton:Spring的默认作用域,容器里拥有一个唯一的Bean实例
  • prototype:针对每一个getBean请求,容器都会创建一个Bean实例
  • request:会为每个Http请求创建一个Bean实例
  • session:会为每个session创建一个Bean实例
  • globalSession:会为每个全局Http Session创建一个Bean实例,对该作用域仅对Portlet有效
创建过程
  • 实例化Bean
  • Aware(注入Bean ID、BeanFactory和AppCtx)
  • BeanPostProcessor(s).postProcessBeforeInitialization
  • InitializingBean(s).afterPropertiesSet
  • 定制的Bean init方法
  • BeanPostProcessor(s).postProcessAfterInitialization
  • Bean初始化完毕
销毁过程
  • 若实现了DisposableBean接口,则会调用destroy方法
  • 若配置了destry-method属性,则会调用其配置的销毁方法
显示装配Bean,返回Bean实例

在这里插入图片描述

Main中获取:

在这里插入图片描述

装配Bena:@Value设置默认值

在这里插入图片描述

默认扫描:当前package和子package

在这里插入图片描述

多个可以是使用:@Primary

在这里插入图片描述

<think>我们正在处理用户的问题:"spring-01-ioc is not recognized as a Gradle project"。用户可能在尝试导入或构建一个名为'spring-01-ioc'的项目遇到了问题,提示该项目不是一个Gradle项目。 根据常见的开发经验,这个问题通常发生在以下情况: 1. 项目目录中缺少Gradle的构建文件(如build.gradle或build.gradle.kts)。 2. IDE(如IntelliJ IDEA)在打开项目没有正确识别Gradle项目。 3. 项目是从其他地方复制过来的,可能结构不完整。 解决方案通常包括: - 确认项目根目录下是否存在build.gradle文件。如果没有,需要创建。 - 如果项目原本是Gradle项目,可能是文件损坏或丢失,可以尝试重新构建或从版本控制中恢复。 - 在IDE中,可以尝试手动导入为Gradle项目。 同,我们注意到用户之前提到了一些关于Spring配置的引用,但当前问题与Gradle项目识别有关,所以我们将主要关注Gradle项目结构问题。 步骤: 1. 检查项目目录结构,确保存在build.gradle文件。 2. 如果存在build.gradle,尝试在命令行中运行`gradle tasks`来验证Gradle是否能识别项目。 3. 在IDE中,可以尝试重新导入项目。 另外,引用[3]中提到了使用YAML配置多个profile,但这与Gradle项目识别无直接关系。不过,如果用户的项目是一个Spring Boot项目,那么通常我们会使用Gradle或Maven来构建。 因此,我们将指导用户检查项目结构并提供创建基本build.gradle文件的示例(如果缺失)。 注意:用户的问题中项目名为'spring-01-ioc',这看起来像是一个Spring相关的项目,因此我们假设它需要Spring Boot的依赖。 我们将创建一个简单的build.gradle示例,适用于Spring Boot项目。 同,考虑到用户可能不熟悉Gradle,我们会解释基本步骤。 另外,如果用户使用的是Gradle Wrapper,那么还应该检查gradlew(或gradlew.bat)和gradle/wrapper目录是否存在。 如果用户没有使用Wrapper,建议初始化Wrapper,因为这样能保证构建环境的一致性。 因此,我们的回答将包括: 1. 检查项目结构。 2. 创建build.gradle文件(如果缺失)。 3. 初始化Gradle Wrapper(可选,但推荐)。 4. 在IDE中重新导入项目。 由于用户的问题中提到了“is not recognized as a Gradle project”,我们重点解决Gradle项目的识别问题。 下面开始组织回答。</think>### 解决 "spring-01-ioc is not recognized as a Gradle project" 错误 这个错误表明您的开发环境(如 IntelliJ IDEA 或命令行)无法识别当前目录为有效的 Gradle 项目。以下是分步解决方案: #### 1. **验证项目结构** - 确保项目根目录包含 **build.gradle** 文件(Gradle 的核心配置文件) - 检查基本目录结构应包含: ``` spring-01-ioc/ ├── build.gradle ← 必须存在 ├── settings.gradle ← 推荐存在 ├── gradlew ← Gradle Wrapper 脚本 ├── gradlew.bat ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── src/ ← 源代码目录 ``` - 如果缺少这些文件,说明项目未正确初始化[^1]。 #### 2. **重新初始化 Gradle 项目** **命令行操作:** ```bash # 进入项目目录 cd path/to/spring-01-ioc # 初始化 Gradle 项目(生成缺失文件) gradle init --type java-application # 使用 Gradle Wrapper 构建(确保权限) ./gradlew build # Linux/Mac gradlew.bat build # Windows ``` #### 3. **IDE 中的修复步骤(以 IntelliJ 为例)** 1. 关闭当前项目 2. 选择 **File > New > Project from Existing Sources** 3. 选择项目根目录的 **build.gradle** 文件 4. 勾选 **Use Gradle Wrapper** 选项 5. 点击 **Finish** 完成重新导入 #### 4. **检查 build.gradle 配置** 确保包含 Spring Boot 插件和依赖(基本示例): ```groovy plugins { id 'org.springframework.boot' version '3.1.0' // Spring Boot 插件 id 'io.spring.dependency-management' version '1.1.0' id 'java' } repositories { mavenCentral() // 依赖仓库 } dependencies { implementation 'org.springframework.boot:spring-boot-starter' } ``` #### 5. **常见问题排查** - **文件位置错误**:build.gradle 必须在项目根目录 - **Gradle 版本冲突**:使用 `./gradlew --version` 验证版本 - **缓存问题**:执行 `./gradlew clean --refresh-dependencies` - **代理设置**:在 **gradle.properties** 中添加网络代理配置(如果需要) ``` systemProp.http.proxyHost=proxyhost systemProp.http.proxyPort=8080 ``` > **关键提示**:Spring Boot 项目必须包含 `org.springframework.boot` 插件才能被正确识别为 Spring 项目[^2]。若使用多模块配置,需在 `settings.gradle` 中声明子模块: > ```groovy > rootProject.name = 'spring-01-ioc' > include 'submodule1', 'submodule2' > ``` ### 相关问题 1. 如何在现有 Maven 项目中迁移到 Gradle? 2. Spring Boot Gradle 插件的主要功能有哪些? 3. 如何解决 Gradle 构建的依赖冲突问题? 4. IntelliJ IDEA 中如何配置 Gradle 的 JVM 版本? [^1]: 当 Gradle 核心文件缺失,构建系统无法识别项目结构 [^2]: Spring Boot 插件提供自动配置和依赖管理功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值