设为首页 加入收藏

TOP

Spring原理(1)——容器(一)
2023-07-25 21:39:39 】 浏览:58
Tags:Spring 原理 容器

容器接口

image

BeanFactory

  • 是ApplicationContext的父接口,所有ApplicationContext的实现都组合了BeanFactory。

  • BeanFactory才是Spring的核心容器。

image

从BeanFactory提供的方法来看,主要是从容器中获取Bean。实际上控制反转,依赖注入以及Bean的生命周期管理,都由它的实现类提供。如下展示了BeanFactory其中一个实现类DefaultListableBeanFactory的继承关系。

image

可以看到,它的继承路线上有一个DefaultSingletonBeanRegistry类,这个类我们打开可以看到如下代码段,其中singletonObjects对象正是容器中所有单例对象被保存的地方。

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
	/** Cache of singleton objects: bean name to bean instance. */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);  // 保存了所有的单例对象

	/** Cache of singleton factories: bean name to ObjectFactory. */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
	
	...
}

ApplicationContext

image

ApplicationContext继承自多个接口,因此提供了多种能力,具体提供的能力如下代码所示。

@SpringBootApplication
public class SsmpApplication {

    public static void main(String[] args) throws IOException {
        final ConfigurableApplicationContext context = SpringApplication.run(SsmpApplication.class, args);

        // MessageSource接口提供的功能,实现国际化能力
        context.getMessage("hi", null, Locale.CHINA);
        context.getMessage("hi", null, Locale.US);

        // ResourcePatternResolver接口提供的能力,实现读取资源文件的能力
        final Resource[] resources = context.getResources("classpath*:spring.factories");

        // EnvironmentCapable接口提供的能力,实现获取环境参数的能力,可以获取环境变量、配置等
        final String java_home = context.getEnvironment().getProperty("java_home");
        final String port = context.getEnvironment().getProperty("server.port");

        // ApplicationEventPublisher提供的能力,可以发送事件,实现解耦
        context.publishEvent(new MyEvent(context));
    }

    public static class MyEvent extends ApplicationEvent {

        public MyEvent(Object source) {
            super(source);
        }
    }
}

容器实现

BeanFactory实现

以下代码的注释中展示了BeanFactory是如何注册Bean的,以及注册后如何进行后处理的。

点击查看代码
package com.leo.ssmp;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collection;

@SpringBootApplication
@Slf4j
public class SsmpApplication {

    public static void main(String[] args) {
        // 将MyConfig类注册到BeanFactory中,由BeanFactory管理Bean的生成,销毁
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        final BeanDefinition configDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class)
            .setScope("singleton")
            .getBeanDefinition();
        beanFactory.registerBeanDefinition("config", configDefinition);

        // 向BeanFactory上注册一些后处理器,这些后处理器可
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇详解JAVA线程问题诊断工具Thread .. 下一篇为什么99%的程序员都做不好SQL优..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目