spring容器

spring容器

实现方式

spring中提供了各式各样的IOC容器的实现供用户选择和使用,使用什么样的容器取决于用户的需要

  • BeanFactory 该接口是最简单的容器,提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类,根据XML文件中的定义加载bean,从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用

    java 复制代码
    public interface BeanFactory {
    
       
      // 可以使用&来得到FactoryBean本身,用于区分用FactoryBean产生的对象和FactoryBean本身,
      // 如使用myJndiObject获取到的是FactoryBean产生的对象,使用&myJndiObject可以获取到对应的FactoryBean对象
       String FACTORY_BEAN_PREFIX = "&";
    
       Object getBean(String name) throws BeansException;
       
       <T> T getBean(String name, Class<T> requiredType) throws BeansException;
       
       Object getBean(String name, Object... args) throws BeansException;
       
       <T> T getBean(Class<T> requiredType) throws BeansException;
       
       <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
       
       boolean containsBean(String name);
       
       boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
       
       boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
       
       boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
       
       boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    
       Class<?> getType(String name) throws NoSuchBeanDefinitionException;
      
       String[] getAliases(String name);
    
    }
  • ApplicationContext应用上下文 基于BeanFactory之上构建,提供面向应用的服务,并继承了资源,消息,事件,环境,工厂五种能力常见的实现方式

    java 复制代码

// 实现MessageSource接口,可以支持不同的信息员,支持国际化 // 实现ApplicationEventPublisher,支持了事件机制 public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver

scss 复制代码
> ApplicationContext是一个接口,大部分的方法实现由AbstractApplicationContext实现

- ClassPathXmlApplicationContext   继承了AbstractXmlApplicationContext抽象类,从**类路径**下的XML配置文件中**加载**上下文定义,把应用上下文定义文件当做资源

```java
ApplicationContext  context = new ClassPathXmlApplicationContext("application.xml");

// this(new String[] {configLocation}, true, null);
// refresh为true,parent为null
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {

		super(parent);
		setConfigLocations(configLocations);
		if (refresh) {
			refresh(); // 触发了IOC容器的初始化
		}
	}
  • FileSystemXmlApplicationContext 读取文件系统下的XML配置文件并加载上下文定义

  • XmlWebApplicationContext 读取Web应用下的XML配置文件并装载上下文

  • AnnotationConfigApplicationContext: 注解方式

ConfigurableApplicationContext扩展于ApplicationContext接口,新增了两个主要的方法,refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力

WebApplicationContext专门为WEB应用准备的,允许从相对于WEB根目录的路径中初始化上下文

BeanFactory和ApplicationContext的区别

BeanFactory可以认为是bean集合的工厂类,包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化,是spring最底层的接口,提供了最简单的容器的功能,包含了bean生命周期的控制,调用初始化方法和销毁方法,其采取的是延迟加载,第一次getBean时才会初始化

ApplicationContext继承了BeanFactory并进行了扩展,在初始化上下文时就实例化所有单例的bean,提供了支持国际化的文本消息MessageSource、统一的资源文件读取方式(扩展了ResourceLoader)、消息发送、事件机制(ApplicationEvent和ApplicationListener)等

  • BeanFactory 采用的是延迟加载 形式来注入Bean的,即只有在使用到某个Bean时(调用getBean() ),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext 则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

  • BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

  • BeanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 ApplicationContext 主要面对与 spring 使用的开发者。基本都会使用 ApplicationContext 并非 BeanFactory 。

BeanDefinition

spring通过BeanDefinition来管理基于spring的应用中的各种对象以及它们之间的相互依赖关系。BeanDefinition抽象了对Bean的定义,是让容器起作用的主要数据类型

zhhll.icu/2021/框架/spr...

本文由mdnice多平台发布

相关推荐
程序员南飞1 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
弥琉撒到我2 小时前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
ok!ko6 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589367 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰7 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没8 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥8 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程9 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统