前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?

Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?

作者头像
码农架构
修改2020-10-27 18:51:58
7200
修改2020-10-27 18:51:58
举报
文章被收录于专栏:码农架构

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)

依赖注入案例

代码语言:javascript
复制
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;
    }
}
代码语言:javascript
复制
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);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档