Spring IOC官方文档学习笔记(一)之IOC容器概述
  oTtxkpRl76Le 2023年11月01日 114 0

1.IOC容器简介

(1) org.springframework.beans 与 org.springframework.context 这两个包是Spring IOC容器的基础,在org.springframework.beans中的BeanFactory接口提供了一种能够管理任何类型对象的机制(类似于一个工厂,里面放满了需要被管理的对象),而在org.springframework.context中的BeanFactory的子接口ApplicationContext则在其基础之上提供了更多特性(如AOP,Message resource,Event publication等)。总而言之,BeanFactory提供了一个容器的基本功能,而ApplicationContext可以看做是BeanFactory的扩展,它提供了更多企业级特性

(2) 一个普通的java对象,在交由Spring IOC容器实例化,配置,组装并管理之后,我们称其为bean。IOC容器需要通过XML,Java code等方式来获取有关对象的配置信息(也称为配置元数据),来完成bean的实例化动作。如下所示,我们通过XML的方式定义了一个bean的配置元数据,规定了其id,name和class的值,之后IOC会根据这些信息来构造一个bean并保存

<?xml version="1.0" encoding="UTF-8"?>
<beans ....>

    <bean id="..." name="..." class="..."></bean>
    
</beans>

2.配置元数据

(1) 由上文可知,元数据的概念就是告诉Spring如何实例化、配置和组装的我们应用程序中的对象,如下图

(2) 配置方式:基于xml的配置可用bean标签,基于java的配置用@Configuration和@Bean注解等

下面是一个基于XML配置的标准模板

<?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">
    
    <!-- 在xml中,所有的bean都必须放在beans这一顶级标签中,里面的这些bean标签对应于我们的系统中的实际对象 -->
    <!-- bean标签中的id属性用来标识一个bean,其值不可重复,class用来指定这个bean的类类型(使用全限定类名) -->
    <bean id="..." class="...">  
        <!-- 在bean标签内部来指定该bean的成员变量等 -->
    </bean>

</beans>

3.实例化容器

(1) ApplicationContext接口就代表了IOC容器,如果想要构建它,则可根据实际需要来使用其某个具体的实现类,如ClassPathXmlApplicationContext或FileSystemXmlApplicationContext,它们的构造函数接收一个或多个资源路径,表示从各种外部资源(如XML)中加载配置元数据,如下

ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml");

其中boke/definition.xml配置文件中的内容如下所示

<beans ...>

    <bean id="bId" class="cn.example.spring.boke.ExampleB"></bean>
    
    <bean id="aId" name="aName" class="cn.example.spring.boke.ExampleA">
        <!-- property标签用于bean中成员变量值的注入,name属性:指定JavaBean中的属性名,该属性要有其对应的setter方法,否则无法注入,ref属性:引用另一个bean的id,注入依赖 -->
        <property name="exampleB" ref="bId"></property>
    </bean>

</beans>

此外,如果是基于Java code的配置,还可以使用AnnotationConfigApplicationContext,其构造函数参数接受配置类或需要扫描的包路径,来加载配置元数据,如下所示

ApplicationContext ctx = new AnnotationConfigApplicationContext("cn.example.spring");

4.导入另一份xml中的配置元数据

(1) 通常来说,一个系统会被分为多个模块,某个模块都对应有一份单独的xml文件,因此,当我们需要向一个xml文件中导入另一个xml中的配置元数据时,可以使用import标签,如下所示

<beans ...>
    
    <!-- import标签:导入其它的配置文件;该标签定义于beans标签内部,与bean标签平行 -->
    <import resource="from.xml"></import>
    <import resource="down/son.xml"></import>
   
</beans>

注意:采用的是相对于当前文件(在上面这个例子中为:definition.xml)的路径来导入其他的文件,上面这个例子中,文件结构为
--boke
 |-definition.xml
 |-from.xml
----down
    |-son.xml
definition.xml和from.xml处于同一级目录boke下,而son.xml位于down目录下,该目录是boke目录的子目录。Spring不建议使用相对路径(如:classpath:../beans.xml),但可以使用绝对路径(如:file:C:/spring/boke/from.xml或classpath:/boke/from.xml)来导入其他的xml配置文件

5.使用容器

(1) 容器用来管理bean,使用容器一般情况就是获取它所保存的bean。在ApplicationContext中,提供了getBean()方法(不推荐使用,会对Spring的API产生强依赖)来获取容器中的bean,如下示例所示

//1.创建容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml");

//2.从容器中获取需要bean
ExampleA a = ctx.getBean(ExampleA.class);

//3.使用这个bean
a.doSomething();

此外,还可将GenericApplicationContext与XmlBeanDefinitionReader结合使用,来解析xml中的bean配置元数据并生成对应的bean

//1.创建容器
GenericApplicationContext context = new GenericApplicationContext();

//2.将xml文件的解析工作委托给了xml阅读器XmlBeanDefinitionReader,它会解析xml配置文件,并将解析的bean配置元数据交给GenericApplicationContext
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");

//3.刷新容器,此时容器就会创建出对应的bean
context.refresh();

//4.获取bean
ExampleA a = context.getBean(ExampleA.class);

//5.使用这个bean
a.doSomething();

可见ClassPathXmlApplicationContext中已经包含了xml文件的解析工作

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: jdk的安装与配置 下一篇: 一文速览 Dubbo 3.0
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   54   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
oTtxkpRl76Le