荐 Spring官方文档阅读(一)之IoC容器
1.2.容器概述
经常在学习spring时,听到ApplicationContext,那么到底什么是ApplicationContext
1.BeanFatory的子接口
2.这个接口代表Spring IoC容器,负责实例化,配置和组装Bean
3.容器读取元数据,对象实例,配置文件,组装那些对象的指令
(这些配置元数据可能是XML,java注释,java代码,它更好的表达了我们的应用程序中,各个对象的依赖性)
new ClassPathXmlApplicationContext就是在使用IoC容器
Spring IoC容器不需要用户自己编写
在一个程序中,我们可以创建一个公共的实例对象 ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext,通过这些实例对象来获取到ApplicationContext这个容器来对bean等信息进行操作,这就是使用了IoC容器
Spring容器的构建
可以通过少量的XML配置来指示容器使用JAVA注解或JAVA代码作为元数据格式,以声明方式启用对这些附加元数据的格式的支持
下图是spring工作图,我们的应用对象和配置元数据结合,之后生产一个,可以让我们完全配置和可执行的系统或应用程序
1.2.1.配置元数据
格式:
- 传统上元数据是以xml的格式提供
- Annotation-based configuration:spring 2.5后支持基于注解的方式配置元数据
- Java-based configuration:spring 3.0使用基于java配置的方式配置
spring配置至少是一个bean定义组成的;如果是xml配置,那么bean的配置使用标签,嵌套在标签中;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
id:这个bean的标识字符串
class:bean所引用的全类名
-->
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
定义外部bean
@Configuration,@Bean,@Import,和@DependsOn注释
如果是Java配置,在有@Configuration注解的类中,使用@Bean注解
这些bean的定义是组成应用的对象,不分为Controller,service等层,这种细粒度的区分,但是我们也可以使用AspectJ与Spring依赖注入域对象来控制创建IoC容器之外的对象
1.2.2.实例化容器
利用ApplicationContext的构造函数来读取外部的xml配置
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
导入外部资源
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
services.xml是在当前文件路径下
messageSource和themeSource都在resources下 / 会被忽略
不建议使用 / …/来表示
引入外部XML配置,就可以使用被引入XML配置中的bean
1.2.3.使用容器
ApplicationContext是一个维护bean定义以及相互依赖的注册表的高级工厂的接口
通过T getBean(String name, Class requiredType)可以获取到bean实例
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// use configured instance
List<String> userList = service.getUsernameList();
不建议使用getBean方法,这样可以做到不依赖Spring API
总结:
简单的理解容器就是由真实存在的class和配置元数据(xml,java配置,注解)封装成的一个或多个bean集合,经过Spring包装和管理
本文地址:https://blog.csdn.net/weixin_45220428/article/details/107326385