L04_spring依赖查找

本文深入探讨了Spring框架中的依赖查找机制,包括BeanFactory的单一和集合类型查找,ListableBeanFactory的注解类型查找,延迟依赖查找以及内建依赖的使用。同时,介绍了在依赖查找过程中可能出现的经典异常及其原因。此外,还对比了ObjectFactory和BeanFactory的区别,并讨论了BeanFactory的线程安全性。

spring 依赖查找

在这里插入图片描述

1、单一类型依赖查找

单一类型依赖查找接口 - BeanFactory

(1)根据 Bean 名称查找:getBean(String)
(2)根据 Bean 类型查找 :getBean(Class)
getBeanProvider(Class)( Spring 5.1 Bean 延迟查找)
(3)根据 Bean 名称 和类型查找:getBean(String,Class)

2、集合类型依赖查找

集合类型依赖查找接口 - ListableBeanFactory
(1)根据 Bean 类型查找
getBeanNamesForType(Class)//获取同类型 Bean 名称列表
getBeansOfType(Class)//获取同类型 Bean 实例列表
(2)通过注解类型查找
getBeanNamesForAnnotation(Class<? extends Annotation>)
getBeansWithAnnotation(Class<? extends Annotation>)
• findAnnotationOnBean(String,Class<? extends Annotation>)

3 、延迟依赖查找

org.springframework.beans.factory.ObjectFactory
org.springframework.beans.factory.ObjectProvider
• 函数式接口 :getIfAvailable(Supplier), ifAvailable(Consumer)
• Stream 扩展 : stream()

4、内建可查找的依赖

(1) AbstractApplicationContext 内建可查找的依赖

Bean 名称Bean 实例使用场景
environmentEnvironment 对象外部化配置以及 Profiles
systemPropertiesjava.util.Properties 对象Java 系统属性
systemEnvironmentjava.util.Map 对象操作系统环境变量
messageSourceMessageSource 对象国际化文案
lifecycleProcessorLifecycleProcessor 对象Lifecycle Bean 处理器
applicationEventMulticasterApplicationEventMulticaster 对 象Spring 事件广播器

(2)注解驱动 Spring 应用上下文内建可查找的依赖(部分)

Bean 实例使用场景
ConfigurationClassPostProcesso r 对象处理 Spring 配置类
AutowiredAnnotationBeanPostPro cessor 对象处理@Autowired 以及 @Value注解
CommonAnnotationBeanPostProces sor 对象(条件激活)处理 JSR-250 注解, 如 @PostConstruct 等
PersistenceAnnotationBeanPostP rocessor 对象(条件激活)处理 JPA 注解场景

5、依赖查找中的经典异常

BeansException 子类型

异常类型触发条件(举例)
NoSuchBeanDefinitionException当查找 Bean 不存在于 IoC 容器 时
NoUniqueBeanDefinitionException类型依赖查找时,IoC 容器存在多 个 Bean 实例
BeanInstantiationException当 Bean 所对应的类型非具体类时
BeanCreationException当 Bean 初始化过程中
BeanDefinitionStoreException当 BeanDefinition 配置元信息非 法时

6、ObjectFactory 与 BeanFactory 的区别?

ObjectFactory 与 BeanFactory 均提供依赖查找的能力。 不过 ObjectFactory 仅关注一个或一种类型的 Bean 依赖查找,并 且自身不具备依赖查找的能力,能力则由 BeanFactory 输出。

BeanFactory 则提供了单一类型、集合类型以及层次性等多种依赖查找方式。

7、BeanFactory.getBean 操作是否线程安全?

BeanFactory.getBean 方法的执行是线程安全的,操作过程中会增加互斥锁。

<think>好的,用户需要查找如何使用Spring框架编写一个依赖注入的示例。首先,我需要回忆一下Spring依赖注入的基本概念和实现方式。根据引用[2]中的例子,用户提到了通过构造参数注入KingslayerExplore和OverthrowExplore到不同的Knight类中,并且不需要显式使用new关键字。这说明用户可能对构造器注入比较感兴趣,或者至少需要一个简单的示例来展示依赖注入的基本用法。 接下来,我应该考虑用户可能的开发环境。Spring框架支持XML配置和注解配置两种方式,用户可能需要一个现代的示例,比如使用注解而不是XML。不过引用[3]中提到了XML配置文件的修改,引用[4]则提到Spring.NET的配置文件,所以可能需要同时展示两种方式,或者以Java Spring为主,因为用户的问题明确提到了Spring Framework。 用户提供的引用中有Java和.NET的例子,但用户的问题是关于Spring Framework,也就是Java的,所以应专注于Java Spring。引用[3]中的XML配置可能是一个传统的方法,而现代Spring更倾向于使用注解和Java配置。不过为了全面性,可能需要同时展示XML和注解两种方式。 用户可能需要一个完整的示例,包括组件定义、配置和主类的运行。比如,定义一个服务类和一个依赖类,然后通过Spring注入。例如,UserService依赖UserRepository。这样用户可以看到如何通过依赖注入将Repository注入到Service中。 需要确保示例的步骤清晰,包括必要的注解如@Component和@Autowired,或者使用@Configuration和@Bean。同时,主类中如何启动Spring容器并获取Bean。 另外,用户可能对不同的注入方式感兴趣,比如构造器注入、setter注入或字段注入。根据引用[2],构造器注入的例子可能更合适,因为该引用中是通过构造参数注入的。所以示例中可以采用构造器注入,并说明其优点,比如不可变性和更好的测试性。 同时,需要检查引用中的内容是否有其他需要注意的地方。例如,引用[4]提到依赖注入类似反射工厂的加强版,这可能在解释时提到,帮助用户理解其背后的原理。 最后,生成相关问题,比如不同注入方式的区别、注解配置与XML配置的比较、依赖注入的原理等,这些都可以帮助用户进一步学习。 总结步骤: 1. 创建一个Maven项目,添加Spring依赖。 2. 定义接口和实现类,比如UserRepository和UserService。 3. 使用@Component注解标记这些类。 4. 配置组件扫描,使用XML或Java配置。 5. 在主类中启动Spring容器,获取Bean并调用方法。 6. 展示构造器注入的示例,并说明其他注入方式。 7. 生成相关问题,扩展用户的学习路径。</think>以下是为您准备的Spring Framework依赖注入示例说明,包含两种常用实现方式: ### 一、构造器注入示例(注解方式) ```java // 1.定义接口 public interface UserRepository { String getUserName(Long id); } // 2.实现类 @Component public class MySQLUserRepository implements UserRepository { @Override public String getUserName(Long id) { return "UserFromMySQL"; } } // 3.服务类使用构造器注入 @Component public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public String getUserInfo(Long id) { return userRepository.getUserName(id); } } // 4.启动类 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args); UserService service = ctx.getBean(UserService.class); System.out.println(service.getUserInfo(1L)); } } ``` ### 二、XML配置方式(传统方式) ```xml <!-- applicationContext.xml --> <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"> <bean id="userRepository" class="com.example.MySQLUserRepository"/> <bean id="userService" class="com.example.UserService"> <constructor-arg ref="userRepository"/> </bean> </beans> ``` ### 三、现代推荐方式(Java配置类) ```java @Configuration @ComponentScan("com.example") public class AppConfig { @Bean public UserRepository userRepository() { return new MySQLUserRepository(); } @Bean public UserService userService(UserRepository repository) { return new UserService(repository); } } ``` 关键实现要点: 1. 通过`@Component`注解标记可注入的组件[^3] 2. 使用`@Autowired`标注注入点(构造器推荐) 3. 配置类需使用`@Configuration`注解 4. XML配置需明确定义bean和依赖关系[^4] 5. 容器启动后自动完成依赖装配[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值