Spring 注入、注解及相关概念补充

一、Spring DI 的理解

DI ( Dependency Inject,中文释义:依赖注入 )是对IOC 概念 不同角度的描述,是指应用程序在运行时,每一个 bean 对象都依赖 IOC 容器注入到当前 bean 对象所需要的另一个 bean 对象。(例如:在 Mybatis 整合 Spring 时,SqlSessionFactoryBean 依赖 IOC 容器注入一个 DataSource 数据源 Bean )

二、Spring 的 Bean 是什么?

简单来说,Bean 代表被 IOC 容器管理的对象;我们通过配置文件或注解,告诉 IOC 容器帮助我们管理哪些对象。

XML 复制代码
<bean id="..." class="...">
    <constructor-arg value="...">
</bean>

三、Spring 框架中的常见注入方法有几种?

Spring IOC 的常见注入方法有3种:Setter注入、构造注入属性注入

(1)Setter注入

使用Setter 方法注入 Bean

(2)构造注入

使用构造方法 注入 Bean

(3)属性注入

使用 成员属性 注入 Bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。

四、Spring 中常见的 ApplicationContext 实现类有哪些?

(一)ClassPathXmlApplicationContext

根据类路径 classpath 下的配置文件加载 bean

(二)FileSystemXmlApplicationContext

根据当前磁盘的一个绝对路径下的配置文件加载 bean

(三)AnnotationConfigApplicationContext

根据读取到的注解加载 bean

(四)WebApplicationContext

web 容器下按照配置文件加载 bean

五、Spring 框架注解有哪些?

用于声明 Bean 的注解:

|-------------|-------------------------------------------------------|
| @Component | 定义通用 Bean 的注解,可标注任意类为 Bean,若一个 Bean 不知道属于哪一层,可使用该注解标注 |
| @Repository | 定义数据访问层 Bean 的注解 |
| @Service | 定义业务层 Bean 的注解 |
| @Controller | 定义控制层 Bean 的注解 |

用于注入的注解:

|------------|---------|
| @Autowired | 按类型自动注入 |
| @Qualifier | 按名称自动注入 |

声明配置、扫描、启动特性的注解:

|-------------------------|----------|
| @Configuration | 声明配置类 |
| @ComponentScan | 组件扫描 |
| @EnableScheduling | 启动任务调度 |
| @EnableAspectJAutoProxy | 启动自动代理工厂 |

六、@Component 和 @Bean 的区别?

|-------|---------------------------------------------|----------------------------------------------------------|
| | @Component | @Bean |
| 注解作用于 | 类 | 方法 |
| 方式 | 通常通过类路径扫描来实现自动扫描并完成装配 Bean 到 Spring IOC 容器中 | 通常用于注解某个方法,通过 @Bean 注解告诉了Spring IOC 容器,该方法的返回值实例是一个 Bean |

七、@Autowired 和 @Resource 的区别是什么?

|--------|-----------------|-----------------|
| | @Autowired | @Resource |
| 提供方 | Spring 提供的注解 | JDK 提供的注解 |
| 默认注入方式 | byType(按类型自动注入) | byName(按名称自动注入) |

八、BeanFactory 和 ApplicationContext 区别?

两者之间的关系:

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当作 Spring 的容器。

两者区别与不同:

BeanFactory 是 Spring 里面最底层的接口,是 IOC 的核心,定义了 IOC 的基本功能,包含了各种 Bean 的定义、加载、实例化、依赖注入生命周期管理等行为。

ApplicationContext 接口作为 BeanFactory 接口的子接口,包含 BeanFactory 所具备的功能外,还提供了其它框架功能:继承 MessageSource(支持国际化)、资源文件访问、可以同时加载多个配置文件、可以通过监听器管理 Bean 的生命周期。

Bean 的创建加载方式:

BeanFactory 采用的是延迟加载形式来注入 Bean ,只有在使用到某个 Bean 时,才会对该 Bean 进行加载实例化。这样不能提前发现一些存在的 Spring 的配置问题。若 Bean 的某一个属性没有注入, BeanFactory 加载后,直至第一次使用调用 getBean() 方法才会抛出异常

ApplicationContext 是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext 启动后预载入所有的单实例 Bean ,所以在运行时速度比较快,因为它们已经创建好了。相对于 BeabFactory ,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置 Bean 较多时,程序启动较慢

相关推荐
程序员cxuan几秒前
读懂 Claude Code 架构分析系列,第二篇:Claude Code 是怎样启动的?
人工智能·后端·程序员
唐青枫6 分钟前
Java RabbitMQ 实战指南:从交换机、队列到可靠消息处理
java
卓怡学长11 分钟前
w272基于springboot便民医疗服务小程序
java·spring boot·spring·小程序·intellij-idea
用户409666013175112 分钟前
MySQL 慢查询优化实战:从 EXPLAIN 到索引设计
后端
一方~13 分钟前
权限系统设计
java
霸道流氓气质15 分钟前
Harness Engineering 从理论到实战:基于 Spring AI Alibaba 的完整实现指南
数据库·人工智能·spring·harness
盐焗鹌鹑蛋18 分钟前
【C++】多态
java·jvm·c++
rebibabo19 分钟前
Java高并发底层原理(七)volatile 到底解决了什么问题
java·学习笔记·volatile·可见性·有序性·指令重排
从零开始的代码生活_31 分钟前
Linux epoll 多路转接详解
linux·运维·网络·后端·tcp/ip·计算机网络·php
IT_陈寒37 分钟前
Vue的响应式更新把我坑惨了,原来是这个原因
前端·人工智能·后端