bingmous

欢迎交流,不吝赐教~

导航

Spring Framework Reference 5.3.27 - Core Technologies

Chapter 1. The IoC Container

IoC容器和bean介绍

org.springframework.beansorg.springframework.context,这两个包是spring框架IOC容器的基础。BeanFactory接口提供了高级的配置机制来管理其他所有类型的能力,ApplicationContext是它的子接口,添加了:

  • 更容易整合Spring AOP
  • 消息资源处理(国际化)
  • 事件发布
  • 作为应用层具体的上下文使用,如WebApplicationContext

ApplicationContextBeanFactory的超集,提供了许多企业功能

在spring里面,由IOC管理的对象成为bean,bean是一个初始化的、组装好的、有spring容器管理的对象。bean,以及它们的依赖,通过容器使用的配置元数据来反映出来

容器简介

org.springframework.context.ApplicationContext接口代表了IoC容器,负责实例化、配置、组装bean。通过读取元数据来进行这些操作,元数据包括xml配置、java注解、和java代码。在一个独立应用中,可以通过ClassPathXmlApplicationContextFileSystemXmlApplicationContext创建ApplicationContext的实例。xml是比较传统的定义配置元数据的方式,可以通过注解或代码作为元数据,并通过少量的xml配置声明对这些额外形式的支持。

大多数场景下,不需要用户手动实例化IoC容器。

以一个高的视角来看spring是如何工作的,用户类结合元数据,在ApplicationContext创建后就有了一个可执行的系统。
image

Configuration Metadata 配置元数据

IoC容器根据配置元数据进行配置,这些元数据代码了如何如何实例化、配置组装对象

xml是比较传统的方式,大部分章节用来阐述IoC容器关键概念和特性

其他形式的元数据配置:

  • 基于注解的配置
  • 基于java的配置(@Configuration, @Bean, @Import, and @DependsOn

xml配置在<beans/>顶层元素内定义bean,java配置在@Configuration注解类使用@Bean方法定义bean

其中,bean标签里,id为bean的唯一标识符,class定义bean的实际类型的全类名

实例化一个容器

直接new ClassPathXmlApplicationContext("xxx.xml")

bean标签内的property属性表示该类的属性,ref则表示要应用的IoC内的bean的id

在一个顶层beans标签内可以通过import来导入别的xml配置元数据

使用容器

ApplicationContext接口维护了注册的bean信息及他们的依赖信息,通过getBean()可以检索到bean实例

groovy定义的bean元数据,使用new GenericGroovyApplicationContext()创建ApplicationContext实例

更灵活的方式是new GenericApplicationContext();,然后使用new XxxBeanDefinitionReader(context).loadBeanDefinitions("xxx");,然后执行context.refresh()就可以加载任意元数据了

虽然可以使用getBean()及其他提供的方法检索bean,但是应用程序不应该使用他们,否则就依赖了Spring的api。比如spring与web框架的整合就提供了各种web框架组件的依赖注入,可以允许你通过元数据声明对一个具体bean的依赖

bean简介

ioc容器管理bean,这些bean是通过配置元数据有ioc创建的,在ioc容器内部,这些bean的定义由对象BeanDefinition表示,它包含以下元数据:

  • 全类名:bean的实际实现类
  • bean的行为配置,记录bean在容器中应该做的动作,如scope, lifecycle callbacks, and so forth
  • 对其他bean的引用,或者是依赖
  • 新创建的对象需要的其他配置信息,如一个bean使用的池大小、连接数配置(这个不就是bean的属性吗?为什么也是bean定义的一部分,配置绑定进来?)

BeanDefinition通过一系列属性来表示bean定义:
image

除了使用bean定义包含了如何创建bean外,ApplicationContext也允许注册ioc容器外的对象,先通过ApplicationContext.getBeanFactory()获取到BeanFactory,返回的默认类型是DefaultListableBeanFactory,它的方法registerSingleton(..) and registerBeanDefinition(..)可以注册对象为bean。然而,一般应用使用常规配置的bean就可以正常工作了。

注意,手动注册的bean要尽可能的早,可能其他bean会自动注入该对象,从某种程度上讲,bean定义允许覆盖,但是官方不支持,可能导致并发异常。

命名bean

每个bean都有一个或多个标识符,这些标识符必须在容器内唯一,一般一个bean只有一个标识符,如果需要多个可以使用别名。

xml配置中,可以同时指定id和name,name属性可以定义多个,使用,/;/空格分隔。如果不指定name或者id,容器会自动生成一个唯一名称。如果想通过ref或服务定位的方式引用这个bean,必须提供一个名称,不提供容器名称的动机跟内部bean和自动注入话题有关。

bean命名惯例:首字母小写,类似属性命名

在spring扫描类路径上的组件时,会为没有命名的组件生成一个名称,通常会首字母小写。特殊情况下,如果开头的多个字母都是大写,则会直接使用该名称。规则同java.beans.Introspector.decapitalize

在bean定义之外定义别名
在beab定义里可以通过id及name定义多个别名,这有时候并不够用,对于大型系统,可能希望在别处定义别名。可以使用<alias/>。java注解中可以在@Bean定义别名

实例化bean

在bean标签内通过class属性指定要创建的对象Class,以下两种方法使用这个class属性:

  • 指定要创建的bean,容器通过反射直接创建这个bean
  • 指定这个class中的static工厂方法,工厂返回的对象为创建的bean

如果要为静态内部类创建bean,使用$.指定内部类

通过构造器实例化bean
bean标签指定class,这个class有无参构造器,那么就可以直接创建bean了(有参构造器见注入依赖部分)

通过静态工厂方法实例化
todo

Chapter 2. Resources

Chapter 3. Validation, Data Binding, and Type Conversion

Chapter 4. Spring Expression Language (SpEL)

Chapter 5. Aspect Oriented Programming with Spring

Chapter 6. Spring AOP APIs

Chapter 7. Null-safety

Chapter 8. Data Buffers and Codecs

Chapter 9. Logging

Chapter 10. Appendix

posted on 2023-12-22 21:51  Bingmous  阅读(28)  评论(0编辑  收藏  举报