Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?
时间:2022-07-28
本文章向大家介绍Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Spring 容器最基本最基本的接口就是BeanFactory。BeanFactory负责配置,创建、配置Bean,其中有一个子接口ApplicationContext,也被称为Spring上下文。容器同时还管理这Bean和Bean之间的依赖关系
Spring IoC容器的实现,从根源上是BeanFactory,但是真正作为一个可以独立使用的IoC容器的还是DefaultListableBeanFactory因此可以说DefaultListableBeanFactory是整个Spring IoC的始祖
上一篇文章简单阐述Spring的依赖查找方式
- 通过Bean 名称查找. Object getBean(String name)
- 通过Bean 的类型查找 <T> T getBean(Class<T> requiredType)
- 通过Bean 的名称+类型组合查找 <T> T getBean(String name, Class<T> requiredType)
- 通过注解查找 Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
如果说BeanFactory 是Spring 的心脏,那么ApplicationContext就是完美的身躯,继承BeanFactory接口,除了包含BeanFactory的所有功能之外。在国际化、资源访问(如:URL和文件)、事件传播等方面进行了良好支持
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean,通过ApplicationContext的依赖树图,不难发现Spring Bean的依赖注入来源
- 自定义的Bean
- 依赖注入Bean (如:内建依赖 BeanFactory)
- 容器内建依赖 Bean (如:容器内建 Environment)
依赖注入案例
public class UserRepository {
private Collection<User> users; // 自定义 Bean
private BeanFactory beanFactory; // 內建非 Bean 对象(依赖)
private ObjectFactory<ApplicationContext> objectFactory;
public Collection<User> getUsers() {
return users;
}
public void setUsers(Collection<User> users) {
this.users = users;
}
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
public ObjectFactory<ApplicationContext> getObjectFactory() {
return objectFactory;
}
public void setObjectFactory(ObjectFactory<ApplicationContext> objectFactory) {
this.objectFactory = objectFactory;
}
}
public class DependencyInjectionDemo {
public static void main(String[] args) {
// 启动 Spring 应用上下文
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection-context.xml");
// 依赖来源一:自定义 Bean
UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class);
// 依赖来源二:依赖注入(內建依赖)
System.out.println(userRepository.getBeanFactory());
ObjectFactory<ApplicationContext> userFactory = userRepository.getObjectFactory();
System.out.println(userFactory.getObject() == applicationContext);
// 依赖来源三:容器內建 Bean
Environment environment = applicationContext.getBean(Environment.class);
System.out.println("获取 Environment 类型的 Bean:" + environment);
}
}
- Spark源码系列之spark2.2的StructuredStreaming使用及源码介绍
- Hbase源码系列之scan源码解析及调优
- spark源码系列之内部通讯的三种机制
- Hbase源码系列之regionserver应答数据请求服务设计
- 大数据基础系列之kafkaConsumer010+的多样demo及注意事项
- 大数据基础系列之kafka011生产者缓存超时,幂等性和事务实现
- 大数据基础系列之提交spark应用及依赖管理
- 大数据集群安全系列之kafka使用SSL加密认证
- 基于zookeeper leader选举方式一
- Spark与mongodb整合完整版本
- spark源码系列之累加器实现机制及自定义累加器
- Scala语法基础之隐式转换
- SparkSql的优化器-Catalyst
- Scala语言基础之结合demo和spark讲实现链式计算
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- LeetCode 102 | 将二叉树中同层的元素归并在一起
- Git | Git入门,成为项目管理大师(二)
- 学习|Unity3D使用协程实现减速停车效果
- R语言实现文献的批处理
- django-haystack ImportError: cannot import name 'six' from 'django.utils' in django 3.x
- Thanos 与 VictoriaMetrics,谁才是打造大型 Prometheus 监控系统的王者?
- 阅读大型开源软件的四个技巧
- Tomcat NIO(7)-Poller
- python 求解线性规划问题
- Netty高性能之道
- 关于im-live-sells自定义群组字段的使用
- 浅谈CAP与Kafka
- windows下查看进程(进阶)
- Salesforce LWC学习(二十二) 简单知识总结篇二
- 初识Netty